在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; }
除了上面这三个用处/好处外, 还有什么别的? 请大家指正.