序列化与反序列化
- 序列化:将对象转化为容易传输和保持的格式的过程
- 反序列化:重新解析构造被序列化的对象
我们把变量从内存中变成可存储或传输的过程称之为序列化。
序列化之后,就可以把序列化的内容写入磁盘或者通过网络传输到别的机器上。
反之,把变量内容从序列化的对象重新读到内存里称之为反序列化。
意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,以后可以恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
使用场景: 所有可以在网络上传输的对象都必须是可序列化的,所有保存到磁盘上的java对象都必须是可序列化的。通常建议:程序创建的每个javaBean类都必须实现Serializeable接口。
注释:很多代码中实体Bean都实现了Serializable接口,Serializable接口是java.io包中定义的用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。
关于serialVersionUID
对于JVM,要进行持久化的类必须要有一个标记,只有持有这个标记JVM才允许类创建的对象可以通过IO系统转化为字节数据,而这个标记就是Serializable接口。而在反序列化的过程中则需要使用serialVersionUID来确定由那个类来加载这个对象,所以当我们在实现Serializable接口的时候,会尽量的显示的去定义SerializableUID,
private static final long serializableUID = 1L;
在反序列化的过程中,若接收方为对象加载类时,若该对象的serialVersionUID与对应的持久化时的类不同,则会抛出invalidClassException异常。例如在反序列化时,将serialVersionUID改为2L
会导致如下异常
java.io.InvalidClassException: cn.example.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)
本文来自博客园,作者:我只有一天的回忆,转载请注明原文链接:https://www.cnblogs.com/cc-coding/articles/15923112.html

浙公网安备 33010602011771号