用于非可序列化属性的Java序列化

时间:2014-04-03 07:24:20

标签: java serialization

我有一个需要序列化的课程。

示例

public class Employee implements Serializable {
   Column column;
   public Column getColumn() {
       return column;
   }
}

当我尝试序列化员工对象时,我得到了异常

java.io.NotSerializableException:net.sf.jsqlparser.schema.Column     在java.io.ObjectOutputStream.writeObject0(未知来源)

我不能将Column属性设置为瞬态,因为需要信息。 我该如何解决这个问题?

5 个答案:

答案 0 :(得分:1)

要实现自定义序列化,您必须在Employee中实现writeObject和readObject,如下所示:

private void writeObject(ObjectOutputStream os) {
    // throws IOException {
   try {
    os.defaultWriteObject();
    os.writeInt( ... ); // here serialize column
   } catch (Exception e) { e.printStackTrace(); }
  }

  private void readObject(ObjectInputStream is) {
    // throws IOException, ClassNotFoundException {
   try {
    is.defaultReadObject();
    column = new Column( /*is.readInt() ... */); // here deserialize column
   } catch (Exception e) { e.printStackTrace(); }
  }

你也应该将你的列字段标记为非Serializable类型为transient:

transient Column column;

这样ObjectOutputStream将跳过序列化它(不会抛出异常),你将在readObject中序列化它。

答案 1 :(得分:0)

列类应该实现Serializable

答案 2 :(得分:0)

如果您在反序列化后需要这些信息,则必须使用custom serialization

答案 3 :(得分:0)

有一个解决方案。通过扩展Column和实现并使其可序列化来创建自定义类。

class ColumnDup extends Column implements Serializable{}

并使用ColumnDup代替Column。

答案 4 :(得分:0)

您可以使用

编写自定义序列化bu

private void writeObject(ObjectOutputStream out)

private void readObject(ObjectInputStream in)

参考此有用链接http://www.coderanch.com/t/504517/java/java/Customize-readObject-writeObject