Serializable 和serialVersionUID 的作用

来源:互联网 发布:matlab矩阵绘制三维图 编辑:程序博客网 时间:2024/05/18 03:22

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

原创粉丝点击