Java对象序列化是JDK1.1中引入的机制,用于将Java对象的状态转换为字节数组,以便存储和传输,并且可以将字节数组转换回Java对象原有的状态。Java对象序列化的思想是:“冻结”Java对象状态,写入磁盘或者通过网络传输,然后“解冻”Java对象状态,恢复出Java对象状态。
本文主要分三个部分:
1、Java对象序列化和反序列化的基本流程;
2、Java序列化机制使用过程中需要注意的一些关键点;
3、Java序列化机制一些不常被使用的功能;
Java对象的序列化流程:
下面给出writeHierarchy的部分代码:
if (osc.hasMethodWriteObject()) { final Method method = osc.getMethodWriteObject(); try { method.invoke(object, new Object[] { this }); executed = true; } catch (InvocationTargetException e) { Throwable ex = e.getTargetException(); if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } else if (ex instanceof Error) { throw (Error) ex; } throw (IOException) ex; } catch (IllegalAccessException e) { throw new RuntimeException(e.toString()); } } if (executed) { drain(); output.writeByte(TC_ENDBLOCKDATA); } else { // If the object did not have a writeMethod, call // defaultWriteObject defaultWriteObject(); } 可以看到在这部分代码中,会判断Java对象是否重写了writeObject方法,如果重写了writeObject方法,则通过反射调用writeObject方法,否则调用defaultWriteObject方法。Java对象的反序列化流程:
下面给出readObjectForClass的详细代码:
if (targetClass == null || !mustResolve) { readMethod = null; } else { readMethod = classDesc.getMethodReadObject(); } if (readMethod != null) { // We have to be able to fetch its value, even if it is private readMethod.setAccessible(true); try { readMethod.invoke(object, this); } catch (InvocationTargetException e) { Throwable ex = e.getTargetException(); if (ex instanceof ClassNotFoundException) { throw (ClassNotFoundException) ex; } else if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } else if (ex instanceof Error) { throw (Error) ex; } throw (IOException) ex; } catch (IllegalAccessException e) { throw new RuntimeException(e.toString()); } } else { defaultReadObject(); } if (hadWriteMethod) { discardData(); }可以看到在这部分代码中,会判断Java对象是否重写了readObject方法,如果重写了readObject方法,则通过反射调用readObject方法,否则调用defaultReadObject方法。
1、序列化只针对对象状态,不针对类状态,所以,序列化的过程中是不会保存静态变量的;
2、如果子类实现了Serializable接口,父类没有实现Serializable接口,那么在子类的序列化过程中只会保存子类中定义的成员变量;
3、使用transient关键字修饰的成员变量,在序列化过程中不会被保存,在反序列化过程中会被置为默认值;
