`

java编程思想阅读笔记(十)I/O系统(下)

 
阅读更多
补充下对象序列化的相关内容。至于XML读写之类的就不写了,无非也就是按照规定方式读写的东西。
对象的序列化将那些实现了Serializable(Externalizable)接口的对象转换成一个字节序列,并能在以后将这字节序列完全恢复为原来的对象;说得白话些就是将对象相关的信息保存起来(可以写到文件里,或者远程发送出去),在需要的时候把这些保存的信息再恢复出来形成对象;这里就会有下面一些问题:
1.保存了完整的对象信息了吗?
对象的序列化的字节序列中,保存了对象的数据成员(属性),同时也包括了其成员所引用的信息;在恢复过程中不需要调用任何构造器;那么经过远程传输为什么却不可以直接恢复,原因是需要用到起class对象信息,看一下简单的用法:
ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(""));
out.writeObject(duixiang);

ObjectInputStream in = new ObjectInputStream( new FileInputStream(""));
(类型)in.readObject();
这是一个简单的将对象序列化到文件中,然后读取文件再恢复的过程;不难理解如果是不同程序之间对象的恢复,至少得有这个对象的类型信息啊。
2.有些成员不想保存当前信息
对于序列化的控制,可以使用Externalizable接口,通过writeExternal() readExternal()方法来做。这个在序列化时通过将当前信息在writeExterna方法中保存想要保存的信息,恢复时,调用默认的构造器之后,通过readExternal方法将保存的信息恢复出来。这里就看到与实现Serializable接口的区别,一个不需要调用任何的构造器,一个调用默认的构造器。
那么如果想用到Serializable的自动化,又不想保存部分成员信息呢,可以使用transient关键字:
private transient string password;
3.对于引用的分歧
如果序列化多个对象,而都引用了一个对象,那么这个对象在恢复的时候是有不同的副本还是只有一个存储地址?通过下面的例子可以看到:

输出结果:


对于写到一个流中的引用,确实都指向一个地址,而对于不同的流则有不同的副本。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics