本人在看集合框架的相关知识时看到ArrayList中的重要对象 Object[] elementData是用transient关键字修饰的,HashMap中的Node<K,V>[] table也一样,开始只知道这个关键字作用是在序列化是不会保存被修饰变量的值。
参照九劫散仙文章,写一点简单的总结:
1.ArrayList在使用transient关键字来“屏蔽”elementData的序列化的同时,自己实现了其独有的序列化方式,
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
}
在序列化时使用的遍历边界是size而不是elementDate.length也就是数组的长度,这样就可以避免将数组中的null元素也一起序列化,从而节省空间和时间。
2.HashMap在实现自己的序列化和反序列化时,要考虑的的一个重要因素是因为hashCode方法是native方法,也就是本地方法,他是和具体的jvm虚拟机的运行时环境有关的,不同的虚拟机可能在实现hashCode方法时并不一样,会导致在A虚拟机进行序列化的对象在B虚拟机上反序列化时会得到意外的结果。
在HashMap反序列化时不考虑去掉null的一个简单原因是HashMap的长度是有约定为2的倍数的并且很多方法实现都是按照这个约定来的,随意去掉只会在反序列化是带来更多的麻烦,所以不考虑去null。
引用前辈的总结:当一个对象的物理表示方法与它的逻辑数据内容有实质性差别时,使用默认序列化形式有N种缺陷,所以应该尽可能的根据实际情况重写序列化方法。
注:本人这里只是简单的记录了一点关于transient关键字的小知识,因水平有限如有不对之处还请不吝赐教,另外想了解HashMap具体的序列化和反序列化的实现可以参照九劫散仙的文章。