java序列化

 

实践基本的例子,原来java有默认的序列化机制(字节流和java对象的相互转换机制)

http://www.cnblogs.com/bluesky5304/archive/2010/04/07/1706061.html

1 序列化机制其实可以理解为应用层的一种协议,规定了字节流的每一位表示的信息。

http://longdick.iteye.com/blog/458557

2 对象序列化后流里面存储了类的信息和实例字段的信息,反序列jvm会根据byte流中头信息构造一个实例,然后依次把流中的实例字段信息设置进去。基础数据类型比较简单,引用类型序列化较为复杂,要维护引用图

具体jdk代码为

java.io.ObjectStreamClass.newInstance(),通过这个实例化对象,然后通过sun.reflect.FieldAccessor.setLong(Object, long)设置字段。ObjectStreamClass相当于是byte流中的头信息生成的对象。从代码看出了java序列化使用了反射,那么性能。。new一个简单的object消耗46纳秒,通过反射newInstance需要200纳秒,相差5倍,但是和io相比,简直可以忽略不记。

http://tech.ddvip.com/2009-08/1251712374129370.html

http://java.chinaitlab.com/base/807719_3.html

http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf

子类实现序列化接口,父类不实现,那么会默认调用父类无参构造函数,如果父类没有定义无参构造函数,那么抛出异常(父类状态不保存)

 

序列化的几个tip

l 当父类继承Serializable接口,所有子类都可以被序列化
l 子类实现了Serializable接口,父类没有,父类中的属性不能序列化(不报错,数据会丢失),但是子类中属性人能正确序列化
l 如果序列化的属性是对象,这个对象也必须实现Serializable接口,否则会报错
l 在反序列化时,如果对象的属性有修改或删减,修改的部分属性会丢失,但不会报错
l 在反序列化时,如果serialVersionUID被修改,那么反序列化时会失败
l 如果一个父类没有实现Serializable接口,他的内部类如果不是static的,即使实现了序列化接口,也会序列失败。因为非静态内部类会保存一个指向父类的类型this变量,而序列化类的所有属性必须实现序列化接口,所以要将内部类设置成静态类
l List或者Map容器中包含的泛型类型也必须实现Serializable接口,否则也会报java.io.NotSerializableException

 

 

 

 

你可能感兴趣的:(java,序列化)