如何自定义复杂对象的序列化?

时间:2010-06-29 09:13:38

标签: java serialization

我有一个复杂的对象,包含我希望作为序列化对象传递的字段和数据库引用。我实现了界面,但另一方面它没有用,并且出现意外错误。

我想要做的是,在序列化之前告诉只有ID被序列化,并且在反序列化之后返回ID并更容易地重建项目。

为了帮助代码,我有

setId();
getId();
and Load() methods

我想通过Object完成。

如何做到这一点?

2 个答案:

答案 0 :(得分:4)

serialize数据库资源无意义,因此您需要将非序列化字段设置为transient,然后在readObject方法中解析它们。 e.g:

private int id;
private transient java.sql.Connection connection;

private void readObject(ObjectOutputStream out) throws IOException {
    out.defaultReadObject();
    connection = DriverManager.getConnection();
}

这里的id字段将在defaultReadObject()中反序列化,但是如果你想要一个数据库资源,你必须自己管理它,因为这样的瞬态数据不能在JVM之间传输。

答案 1 :(得分:2)

看一下有效Java(Joshua Bloch)讨论序列化的第54,55,56和57项。总结

  1. 在你必须使用之前不要使用它。
  2. 为您的班级提供serialVersionUID。 (请不要将其保留为1)
  3. 提供readObject,writeObject
  4. 不要忘记在上面的两个
  5. 中调用defaultReadObject和defaultWriteObject
  6. 将所有字段标记为不可序列化为瞬态
  7. 标记可以使用其他字段构建的所有字段瞬态
  8. 如果您有链接列表等,请考虑使用自定义序列化表单(项目55 Effective Java)
  9. 如果你上课是单身人士,要小心。提供readResolve方法
  10. 最后,彻底阅读了Serializable的javadoc和Effective Java的54-57项。它也会回答你的其他问题。

    干杯