Serializable 接口的作用
java对象在进行io传输的时候,需要序列化编译成二进制字节码
然后接收到二进制之后反序列化为对象
需要实现该接口才能序列化
ObjectOutPutStream:
代码块 部分 wirteObject
// remaining cases
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum<?>) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
备注:可以看出对象必须是实现序列化或者枚举、String、数组对象
serialVersionUID 的作用
java对象在进行io传输的时候,序列化的一个版本号,如果反序列化的时候对象的serialVersionUID 与序列化时的serialVersionUID 不一致,会抛出InvalidClassException.
如果不显示提供一个serialVersionUID ,jvm会通过class去计算得到一个serialVersionUID ,应该是根据属性 field来计算的. 我测试中修改属性会造成反序列化对象失败,增加方法等没有改变序列化的uid.
所以显示的写serialVerionUID 可以保证前后版本的兼容以至于在修改代码(属性[ transient也会有影响])之后不会出现invalidClassException