Java复习笔记10--序列化

Posted zhouQing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java复习笔记10--序列化相关的知识,希望对你有一定的参考价值。

Java序列化

Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里(序列化),并且可以从其它地方把该Byte 流里的数据读出来(反序列化)。

序列化用途

  • 想把的内存中的对象状态保存到一个文件中或者数据库中时候

  • 想把对象通过网络进行传播的时候

serialVersionUID

注意到上面程序中有一个 serialVersionUID ,实现了Serializable接口之后,Eclipse就会提示你增加一个 serialVersionUID,虽然不加的话上述程序依然能够正常运行。

序列化 ID 在 Eclipse 下提供了两种生成策略

  • 一个是固定的 1L

  • 一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具,根据类名、接口名、成员方法及属性等来生成)

上面程序中,输出对象和读入对象使用的是同一个Person类。

如果是通过网络传输的话,如果Person类的serialVersionUID不一致,那么反序列化就不能正常进行。例如在客户端A中Person类的serialVersionUID=1L,而在客户端B中Person类的serialVersionUID=2L 那么就不能重构这个Person对象。

静态对象序列化

串行化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符都不能保存。

如果把Person类中的name定义为static类型的话,试图重构,就不能得到原来的值,只能得到null。说明对静态成员变量值是不保存的。这其实比较容易理解,序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。

transient

经常在实现了 Serializable接口的类中能看见transient关键字。这个关键字并不常见。

transient关键字的作用是:阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。

当某些变量不想被序列化,同是又不适合使用static关键字声明(作用和static一样),那么此时就需要用transient关键字来声明该变量。

在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

:对于某些类型的属性,其状态是瞬时的,这样的属性是无法保存其状态的。例如一个线程属性或需要访问IO、本地资源、网络资源等的属性,对于这些字段,我们必须用transient关键字标明,否则编译器将报措。

继承问题

  • 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。

  • 一个子类实现了 Serializable 接口,它的父类都没有实现 Serializable 接口,要想将父类对象也序列化,就需要让父类也实现Serializable 接口。

第二种情况中:如果父类不实现 Serializable接口的话,就需要有默认的无参的构造函数。这是因为一个 Java 对象的构造必须先有父对象,才有子对象,反序列化也不例外。在反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。因此当我们取父对象的变量值时,它的值是调用父类无参构造函数后的值。在这种情况下,在序列化时根据需要在父类无参

 

 

以上是关于Java复习笔记10--序列化的主要内容,如果未能解决你的问题,请参考以下文章

笔记总结计算机系期末复习专业课学习算法与其他笔记

java IO复习笔记

JAVA NIO复习笔记

Java复习笔记9--四舍五入

java复习笔记

Linux学习笔记7_基本命令复习2(seq sed awk)