序列化(二): 为什么要序列化?
在readResolve()方法与序列化中,由readResolve方法想到了序列化, 那为什么要序列化呢? 应该说很久没考虑过类似这样Java底层一点的问题了. 在本篇中,笔者试着总结归纳下现在我能想到的原因,如有不周或不全的地方请大家多多指正.为什么要序列化?或者说序列化能带来什么好处? 大致想来有如下几个原因:
1, 支持RMI. 我们知道利用RMI机制可以跨JVM地服务互访,而服务互访肯定是要通信的,也就是说要传递数据的,对象的序列化这时就提供了数据传送前后的拆装和组装机制.这方面的知道只是理解,工作中也没有真正用过,更进一步说,现在RMI用的很少很少,貌似也没必要花精力为研究这一块的东西了. Google时,发现一篇文章,记在这里Introduction to Java RMI.
2, 一种对象克隆方式. 利用序列化,我们可以先把某个对象序列化对内存,再反序列化地从内存读出,这样就达到一种变相克隆的效果.这时的一个注意, 确保要克隆对象里属性及属性的属性都是实现了Serializable接口的,不然会报NotSerializableException. 下面是可支持泛型的代码:
public static <T> List<T> serializableCloneToArray(T dc, int count) throws Exception { List<T> results = new ArrayList<T>(); ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bo); os.writeObject(dc); ByteArrayInputStream bi = null; ObjectInputStream oi = null; for (int i = 0; i < count; i++) { bi = new ByteArrayInputStream(bo.toByteArray()); oi = new ObjectInputStream(bi); results.add((T) oi.readObject()); } return results; }<div style="margin-left: 40px;">3,一种持久化方式. 应该说这个用的更少, 简单来说就是把一些类信息序列化地持久到一个文件中, 再在以后的某个时候从文件中反序列化地读出.实现方式跟上面的"对象克隆"类似,只不过是把ByteArrayOutputStream/ByteArrayInputStream分别替换为FileOutputStream/FileInputStream.
页:
[1]