最近在入门python,然后边学的时候对java 的知识点也有一些回顾。最近又碰到单例的安全问题,所以复习下序列化知识。方案有两种,比较简单暴力的是直接实现Serializable
,稍微复杂一点的是实现Externalizable
(需要手动的去序列化哪些值)。需要注意的是实现Externalizable
的类需要有一个public 无参构造函数(会默认调用无参构造函数)。重点说说Serializable
里面需要注意的东西。
用一个demo 来验证问题。是一个Socket 通信的代码,分Client 和Server。
|
|
|
|
最后就是一个Serializable
的对象。
|
|
1. 序列化错误
java.io.InvalidClassException:
(可以通过Server 先运行然后修改序列化对象的内容以后运行Client 来验证)是序列化和反序列化的时校验错误。解决办法是手动定义一个serialVersionUID
。不过最好在设计可序列化对象的时候谨慎,经常变化还是可能出问题。
2. transient
transient
可以修饰成员变量,这样系统默认就不会序列化这个该成员变量。
3. static
static
修饰的成员变量统默认也不会序列化。
4. 顺序
当要手动的序列化transient
和static
的时候就需要注意read 和write 的顺序了。
5. 是否是同一个对象
序列化时的对象和反序列化的对应不是同一个,并且实现Serializable
接口的对象没有调用构造函数。
6. 单例的时候保证只有一个实例。
|
|