serializable,Java对象为啥要实现Serializable接口?
Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。
序列化:序列化就是把对象的状态信息转化为可存储或传输的形式过程,也就是把对象转化为字节序列的过程称为对象的序列化。反序列化:序列化的逆向过程,把字节数组反序列化为对象,把字节序列恢复为对象的过程成为对象的反序列化。
对象序列化的两种用途:
对象序列化的两种用途:1.对象持久化,把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;2.网络传输对象,在网络上传送对象的字节序列。可以通过序列化把主机A进程上的对象序列化为二进制序列,传输到主机B上的进程从序列中重构出该对象。
serialVersionUID的作用。对于JVM来说,要进行持久化的类必须要有一个标记,只有持有这个标记JVM才允许类创建的对象可以通过其IO系统转换为字节数据,从而实现持久化,而这个标记就是Serializable接口。而在反序列化的过程中则需要使用serialVersionUID来确定由那个类来加载这个对象,所以我们在实现Serializable接口的时候,一般还会要去尽量显示地定义serialVersionUID,如:
private static final long serialVersionUID = 1L;
在反序列化的过程中,如果接收方为对象加载了一个类,如果该对象的serialVersionUID与对应持久化时的类不同,那么反序列化的过程中将会导致InvalidClassException异常。例如,在之前反序列化的例子中,我们故意将User类的serialVersionUID改为2L,如:
private static final long serialVersionUID = 2L;
那么此时,在反序例化时就会导致异常,如下:
java.io.InvalidClassException: cn.wudimanong.serializable.User; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:687)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1880)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1746)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2037)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1568)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428)
at cn.wudimanong.serializable.SerializableTest.readObj(SerializableTest.java:31)
at cn.wudimanong.serializable.SerializableTest.main(SerializableTest.java:44)
序列化的注意事项:1.序列化时,只对对象的状态进行保存,而不管对象的方法;2.当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;3.当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;4.序列化会忽略静态变量,即序列化不保存静态变量的状态,静态成员属于类级别的,不能序列化,添加了static、transient关键字后的变量不能序列化;5.在序列化对象时,不仅会序列化当前对象本身,还会对该对象引用的其它对象也进行序列化,如此引用传递序列化;6.如果一个对象包含的成员变量是容器类等并深层引用,那么序列化过程开销也较大。
最后提一下,常见的序列化技术:1.java 序列化;2.XML序列化;3.JSON序列化;4.Hessian 序列化;5.Protobuf 序列化。
作者:夕阳雨晴,欢迎关注我的头条号:偶尔美文,主流Java,为你讲述不一样的码农生活。
还没有评论,来说两句吧...