Java对象序列化Serializable
一直对于Java对象序列化抱有很大的疑问,翻阅了网上各种资料也无法理解为什么需要使用Serializable接口。后来翻阅了《java编程思想》后终于解惑。
1.为什么要将Java对象序列化
当你创建对象时,只要你需要,它就会一直存在,但在程序终止时,它无论如何都不会继续存在。也就是说创建的对象只有在程序运行的时候有效。Java对象的序列化就是为了让对象在程序不运行的情况下任然能存在并保存信息,在下次程序运行时,该对象将被重建并且拥有的信息与上一次运行时所拥有的信息相同。也就是将对象声明为“持久性”的。Java对象序列化是轻量级的持久性,因为对象必须在程序中显式的序列化和反序列化还原。
2.怎么将Java对象序列化
将Java对象序列化只需要实现Serializable接口,Java对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象
3.Java对象序列化主要支持的特性
1)、RMI(Remote method invocation)。RMI允许象在本机上一样操作远程机器上的对象。当发送消息给远程对象和调用远程方法时,就需要用到serializaiton机制来发送参数和接收返回值。 也就是说序列化机制能够弥补不同操作系统之间的差异。比如,可以在运行Windows系统的计算机上创建一个对象,将其序列化。通过网络将它发送给一台Unix系统的计算机,然后在那里准确的重新组装
2)、保存信息。在某个时候把状态信息保存起来,以便以后某个时候能恢复这些状态信息。可以将一个序列化对象写入磁盘,然后在重新调用程序时恢复对象。
利用Serializable的特性实现对象克隆
public static <T>T clone(T obj) throws IOException, ClassNotFoundException {
//将对象序列化
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(obj);
//反序列化对象,实现对象的克隆
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return (T)objectInputStream.readObject();
}
部分摘抄至《Java编程思想》