Java 序列化
1、Java的对象序列化是指将那些实现了Serializable接口的对象转换成一个字符序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。 只要对象实现了Serializable接口(记住,这个接口只是一个标记接口,不包含任何的方法
如果我们想要序列化一个对象,首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构)。而饭序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。
2、serialVersionUID(“串行化版本统一标识符”(serial version universal identifier)) 的作用:在Java中,软件的兼容性是一个大问题,尤其在使用到对象串行性的时候,那么在某一个对象已经被串行化了,可是这个对象又被修改后重新部署了,那么在这种情况下, 用老软件来读取新文件格式虽然不是什么难事,但是有可能丢失一些信息。 serialVersionUID来解决这些问题,新增的serialVersionUID必须定义成下面这种形式:static final long serialVersionUID=-2805284943658356093L;。其中数字后面加上的L表示这是一个long值。 通过这种方式来解决不同的版本之间的串行话问题。
3、示例:
package test.serializable; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Myworld { /** * @param args * @throws IOException * @throws ClassNotFoundException */ public static void main(String[] args) throws IOException, ClassNotFoundException { House house = new House(); System.out.println("序列化前"); Animal animal = new Animal("test",house); System.out.println(animal); ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(out); oos.writeObject(animal); oos.writeObject(animal);//在写一次,看对象是否是一样, oos.flush(); oos.close(); ByteArrayOutputStream out2 = new ByteArrayOutputStream();//换一个输出流 ObjectOutputStream oos2 = new ObjectOutputStream(out2); oos2.writeObject(animal); oos2.flush(); oos2.close(); System.out.println("反序列化后"); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ObjectInputStream ois = new ObjectInputStream(in); Animal animal1 = (Animal)ois.readObject(); Animal animal2 = (Animal)ois.readObject(); ois.close(); ByteArrayInputStream in2 = new ByteArrayInputStream(out2.toByteArray()); ObjectInputStream ois2 = new ObjectInputStream(in2); Animal animal3 = (Animal)ois2.readObject(); ois2.close(); System.out.println("out流:" +animal1); System.out.println("out流:" +animal2); System.out.println("out2流:" +animal3); System.out.println("测试序列化前后的对象 == :"+ (animal==animal1)); System.out.println("测试序列化后同一流的对象:"+ (animal1 == animal2)); System.out.println("测试序列化后不同流的对象==:" + (animal1==animal3)); } }