Java序列化(Serializable)与反序列化

2016/4/11 posted in  Java

序列化是干什么的

为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。

序列化的几种方式

在Java中socket传输数据时,比较常见的做法有两种:

  • 把对象包装成JSON字符串传输
  • 采用Java对象的序列换与反序列化

Object Serialize

Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象

  • 把Java对象转换为字节序列的过程称为对象的序列化。
  • 把字节序列恢复为Java对象的过程称为对象的反序列化。

显示地定义serialVersionUID有两种用途:

  • 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;在某些场合,不希望类的不同版本堆序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID
  • 当你序列化了一个类实例后,希望更改一个字段或者添加一个字段,不设置serialVersionUID,所做的任何更改都将导致无法反序列化旧的实例,并在反序列化时抛出一个异常。如果你添加了serialVersionUID,在反序列旧的实例时,新添加或者更改的字段值将设为初始化值,字段被删除将不设置。

Reference

http://mp.weixin.qq.com/s?__biz=MjM5NzMyMjAwMA==&mid=2651477035&idx=1&sn=617ab67ba4b3fa398ff0a8163eb0b7ac&scene=23&srcid=0411oESGwr6kfzJoeyPUPRWD#rd