深入探索Java对象的序列化 |
||
深刻探究Java对象的序列化 对象序列化便是把对象写入到输出流中,用来存储或者传输 。 对象的反序列化便是从输入流中读取对象 。 要序列化的对象应该实现Serializable接口 。 Serializable接口是一个标识接口,没有 形象 步骤 。 Serializable有一个子接口Externalizable,实现Externalizable接口的类 可以自行操纵对象序列化荷反序列化过程 。 普通来说,没有必要自己实现序列化接口,直接交给Java 虚构机是上策 。 实现了序列化接口的类,假如其成员不需求序列化进去,则 使用transient 要害字进行 润饰 。 下面给出个例子:
运行 后果为:
属性password=null, 注明在序列化过程中 忽略了 。 说到此,还有一个方便 忽略的问题--serialVersionUID : 序列化运行时 使用一个称为 serialVersionUID 的版本号与每个可序列化类 有关联,该序列号在反序列化过程中用于验证序列化对象的发送者和 接纳者是不是为该对象加载了与序列化兼容的类 。假如 接纳者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会招致 InvalidClassException 。可序列化类 可以通过申明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最后 (final) 的 long 型字段)显式申明其自己的 serialVersionUID: ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 假如可序列化类未显式申明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默许 serialVersionUID 值,如“Java(TM) 对象序列化 标准”中所述 。不过,强烈 提议 全部可序列化类都显式申明 serialVersionUID 值,缘由计算默许的 serialVersionUID 对类的 详尽信息 存在较高的敏感性,依据编译器实现的不同可能千差万别,这样在反序列化过程中可能会招致意外的 InvalidClassException 。 因此,为 保障 serialVersionUID 值跨不同 java 编译器实现的 统一性,序列化类必须申明一个明确的 serialVersionUID 值 。还强烈 提议 使用 private 批改器显示申明 serialVersionUID(假如可能),缘由是这种申明仅 利用于马上申明类 -- serialVersionUID 字段作为继承成员没有 用处 。 serialVersionUID 在Eclipse里 可以自动生成,可是在 其余大 部分IDE工具里面都不能自动生成 。然而这个long型值取多少,心里没底,与其写还不如不写 。 |