2010-06-29 44 views
2

我有一个复杂的对象,带有字段和引用数据库,我想作为序列化对象传递。我实现了该接口,但另一方面它不能解决问题,并且出现意想不到的错误。如何自定义复杂对象的序列化?

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

为了帮助一个代码,我有

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

我想通过对象内部完成。

这怎么办?

回答

4

是没有意义的serialize数据库国土资源所以你要设置你的非序列化字段作为transient然后在readObject方法解决这些问题。例如: -

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

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

这里的id字段将在defaultReadObject()反序列化,但如果你想有一个数据库资源,你将不得不管理的是自己作为像这样的瞬时数据不能JVM之间转移。

+0

请问你是否愿意帮我解决一些问题。这是我做序列化的第一个任务。 – Pentium10 2010-06-29 09:18:26

+0

只需看一下'Serializable'的JavaDoc。 – musiKk 2010-06-29 09:20:09

+0

另一个问题。我有一个3级继承,abstract-> first imp-> second implementation。第二个是仅可序列化的,但数据库是抽象定义的。我是否必须在抽象和一级实施中将所有字段标记为暂时的? – Pentium10 2010-06-29 09:21:22

2

看看有关Java(Joshua Bloch)讨论序列化的项目54,55,56和57。总结

  1. 直到你绝对必须使用它。
  2. 为您的班级安装serialVersionUID。 (请不要把它作为1)
  3. 提供的readObject,仔细的writeObject
  4. 不要忘记调用defaultReadObject和defaultWriteObject在上述两个
  5. 马克各个领域不可序列瞬态
  6. 马克所有领域瞬态,可以与其他领域构建
  7. 考虑使用自定义序列化表单(项目55有效的Java),如果你有链接列表等
  8. 小心,如果你是一个单身人士。提供一个readResolve方法

最后,仔细阅读javadoc的Serializable和Effective Java的54-57项。它也会回答你的其他问题。

干杯