目录
深度序列化
在给对象序列化时如果这个对象中有一个属性的类型是一个引用类型,这个引用类型也要支持序列化,这样才能序列化成功,也就是要让这个类也实现Serializable接口
序列化号
当使用对象流对一个对象进行序列化化后,如果我们想要修改这个对象的类的属性(增加属性,修改属性类型,删除属性)时,如果我们对属性做了改变那么反序列化时就会报错,按照常理来说不应该报错,进行修改的数据变成默认值不就好了吗?那么为什么会报错呢?
当我们进行序列化时,jvm会根据对象的属性,属性类型等信息为这个序列化的数据量身定做一个序列化号,当我们反序列化时,会重新获得类的序列化号然后和文件中的序列化号比较,如果我们对属性进行了修改序列化号就会改变,这时比较不成功就会报错
如何避免这种情况呢?
我们可以人为的为对象设置序列化号
class Car{
private static final long serialVersionUID = -1L;
}
这个序列化号是long类型的,而且通常我们都会把它定义为静态的常量,这样不管怎么改变属性反序列化都能成功
如果我们增加了属性那么反序列化时这个属性就是默认值,这点也很好理解因为文件中并没有存储这个属性的数据
忽略序列化
在序列化时我们可能会有这样的需求,有的属性我不想让它序列化,但是按照以前的方法所有的属性都会参与序列化
我们可以使用一个关键字transient
被transient修饰的属性不会参与序列化
class A{
int i ;
transient int j ;
}
注意 静态的属性也不会参与序列化,静态的属性是属于类的不属于对象