Loading

序列化与反序列化

  • 序列化:将对象转化为容易传输和保持的格式的过程
  • 反序列化:重新解析构造被序列化的对象![image-20220221123642012](/Users/criskey/Library/Application Support/typora-user-images/image-20220221123642012.png)

我们把变量从内存中变成可存储或传输的过程称之为序列化。

序列化之后,就可以把序列化的内容写入磁盘或者通过网络传输到别的机器上。

反之,把变量内容从序列化的对象重新读到内存里称之为反序列化。

意义序列化机制允许将实现序列化的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) 
posted @ 2022-02-22 14:45  我只有一天的回忆  阅读(32)  评论(0)    收藏  举报