Serializable 和 Externalizable 测试

1、为了保证序列化和反序列化时序列化对象的一致性,需要定义唯一的serialVersionUID,如果不生成,eclipse会根据类信息(fileds,method)生成默认的UID值,但是可能序列化和反序列化编译环境不一样或者序列化类发生变化而导致的serialVersionUID不一样,所以建议自定义该值

定义带serialVersionUID的序列化对象Person,

Serializable 和 Externalizable 测试_第1张图片

序列化该对象到context.txt文件

Serializable 和 Externalizable 测试_第2张图片

修改序列化化类,并反序列化读取context.txt文件中的Person对象

Serializable 和 Externalizable 测试_第3张图片
Serializable 和 Externalizable 测试_第4张图片

反序列化结果,即时序列化类发生改变,反序列化依然正确,反序列对象为同一个对象,

Serializable 和 Externalizable 测试_第5张图片

定义不带serialVersionUID的序列化类Person,

Serializable 和 Externalizable 测试_第6张图片

执行完SerializableTest后,修改序列化类Person,

Serializable 和 Externalizable 测试_第7张图片

执行反序列化DreSerializableTest ,结果报错 InvalidClassException ,此时前后两次的UID不一致,反序列化不认为是同一个序列化对象:

Serializable 和 Externalizable 测试_第8张图片

2、如果有多个对象,反序列化出来的顺序和序列化时的顺序一致

Serializable 和 Externalizable 测试_第9张图片
Serializable 和 Externalizable 测试_第10张图片

结果与序列化数组结果一致,

Serializable 和 Externalizable 测试_第11张图片

3、序列化类的父类必须也implecement Serializable,必须有默认的无参构造函数,否则会编译报错。

4、ObjectInputStream 没有可以判断对象个数的方法,可以在ObjectOutputStream处的最后一个对象后添加null来判断对象是否读完。

5、若对个对象引用同一个对象,即时没有serialVersionUID且序列化对象没有发生变化,反序列化的时候与反序列化之前的对象引用是一致的。

6、默认的序列化机制会序列化序列化类的签名,非trainsient和非static的域,非static和非trainsient引用会使用引用分享机制。此处根据ObjectOutputStream的注释知道。

7、基本数据类型被写在block-data record里面,每条record1024个字节,枚举类型不被序列化。

你可能感兴趣的:(Serializable 和 Externalizable 测试)