序列化

作用

1.当2个进程在进行远程通信时,相互发送数据,数据都是以二进制的形式传送的。如果我们要传输对象的话,就需要把对象转化为字节数组(二进制数据),接收方接收后反序列成对象。目的在于,传送对象的状态,也就是属性值

2.反序列化后的对象还可以保存到硬盘上。

实现方式

1.实现Serializable接口。

2.实现Serializable接口,并增加void writeObject(ObjectOutputStream out) throws IOExceptionvoid readObject(ObjectInputStream in) throws IOException, ClassNotFoundException这2个方法来自定义某些属性的序列化。

3.实现Externalizable接口(该接口继承自Serializable接口),并重写writeExternamereadExternal方法来完全自定义要序列化的属性。

显式定义serialVersionUID属性的作用

1.对于一个要进行序列化的类,我们希望类的不同版本对序列化兼容(这个类可能前前后后对字段进行删改),如果不显式设置id,这个类的每个版本的id(由系统生成)都是不一样的。那么反序列化的时候,永远只能反序列化最新的实例了(旧的实例因为id不一致将失败)。

2.所以要保证兼容的话,就需要设置一个显式的id。那么在序列化旧的实例时,新添加的或更改的字段会被设置为null,删除的字段不设置。

3.如果我们不想兼容不同版本,我们还可以为不同的版本再设置一个版本号。在序列化和反序列化的过程中(自定义序列化),我们还可以根据版本号来选择性的序列化那些变化的属性的状态。

在springmvc里,javabean都要实现Serializable接口,并生成显式id

其目的就是我们上面分析的序列化的作用以及显式id的作用,特别是在远程服务调用的项目中。

最近的文章

动态代理

1、先谈静态代理对于静态代理,我们已经很熟悉了。我们拥有一个抽象类,真实类继承自抽象类并重写其业务方法,代理类持有真实类的对象实例,在重写业务方法中通过调用真实类的方法,并且添加自己的逻辑。这样代理类就实现了对真实类的行为代理。 静态代理的缺点在于,我们需要实现多个代理类,这无疑是很崩溃的。 2、 …

继续阅读
更早的文章

二叉树

前情提要:1、二叉树每一个节点最多有2个子节点,有左右之分。深度为n的二叉树,最多有2^n^ -1个节点,第n层最多有2^k-1^ 个节点。 2、满二叉树一棵深度为k,且有2^k^ -1个节点的树。 3、完全二叉树完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个 …

二叉树, 算法 继续阅读