我有一个需要序列化的课程。
示例
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属性设置为瞬态,因为需要信息。 我该如何解决这个问题?
答案 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)
您可以使用
编写自定义序列化buprivate void writeObject(ObjectOutputStream out)
private void readObject(ObjectInputStream in)
参考此有用链接http://www.coderanch.com/t/504517/java/java/Customize-readObject-writeObject