涉及的JDK API:
ObjectOutputStream() writeObject(obj) 序列化
ObjectInputStream() readObject() 反序列化
默认的序列化方式:实现Serializable接口
序列化:
定义:将对象及其信息转换为可存储或者传输形式的过程。
常见形式:序列化为文件,序列化为字节流等
作用:易于网络上传输或者存储到硬盘
代码示例:
@org.junit.Test public void test5(){ ObjectOutputStream stream=null; try {//序列化到d:/a.obj stream = new ObjectOutputStream(new FileOutputStream("d:/a.obj")); Per per = new Per(); stream.writeObject(per); stream.close(); } catch (FileNotFoundException e) { } catch (IOException e) { } }
反序列化:
定义:将其他信息还原为java对象的过程。
代码示例:
@org.junit.Test public void test6(){ ObjectInputStream ins=null; try {//反序列化 ins=new ObjectInputStream(new FileInputStream("d:/a.obj")); } catch (FileNotFoundException e) { } catch (IOException e) { } try { Per p=(Per)ins.readObject(); System.out.println(p); } catch (IOException e) { } catch (ClassNotFoundException e) { } }
注意:
只有实现了Serializable接口或者Externalizable接口的类的对象才会被序列化。
静态的变量不会被序列化:因为静态变量属于类级别的。可能有时候实验会发现似乎也被序列化了,那是个假象,因为有可能是把序列化的过程和反序列化的过程写在了一个方法里,那么那个具有静态变量的类还是加载了的,所以。。
使用transient修饰的变量不会被序列化。
默认的反序列化不会调用任何的构造方法。
控制序列化与反序列化,可以再类中写
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
作用是:比如序列化是有些内容较敏感,可以再writeObject中进行处理。。。。
完全由类来控制序列化与反序列化:实现Externalizable接口
void writeExternal(ObjectOutput out) throws IOException
void readExternal(ObjectInput in) throws IOException , ClassNotFoundException
注意:此中方式反序列化时,会先调用类的不带参数的构造方法,如果没有了或者级别不正确,则会报错。
可序列化类的不同版本的序列化兼容性问题:
显示的定义serialVersionUID,带来的好处:
1) 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
2)在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
http://www.2cto.com/kf/201312/264301.html