不可序列化属性的Java序列化

不可序列化属性的Java序列化,java,serialization,Java,Serialization,我有一个需要序列化的类 范例 public class Employee implements Serializable { Column column; public Column getColumn() { return column; } } 当我尝试序列化employee对象时,会出现异常 java.io.NotSerializableException:net.sf.jsqlparser.schema.Column 位于java.io.ObjectOu

我有一个需要序列化的类

范例

public class Employee implements Serializable {
   Column column;
   public Column getColumn() {
       return column;
   }
}
当我尝试序列化employee对象时,会出现异常

java.io.NotSerializableException:net.sf.jsqlparser.schema.Column 位于java.io.ObjectOutputStream.WriteObject 0(未知源)

我无法将列属性设置为瞬态,因为需要信息。
如何解决此问题?

Column类应实现Serializable

如果在取消序列化后需要信息,则必须使用。

要实现自定义序列化,必须在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(); }
  }
此外,还应将不可序列化类型的列字段标记为瞬态:

transient Column column;

这样,ObjectOutputStream将跳过序列化它(不会引发异常),您将在readObject中序列化它。

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

class ColumnDup extends Column implements Serializable{}

并使用ColumnDup代替Column。

您可以使用

私有void writeObject(ObjectOutputStream out)

私有void readObject(ObjectInputStream-in)


请参阅此有用的链接

实现或使用其他方法来持久化对象。注意:请遵守Java命名约定,类应位于
PascalCase
;所以
Employee
。您所说的“我不能将列属性设置为瞬态”是什么意思。如果这是一个选项,您还应该使其可序列化。@Deepak2221:Column类存在于某些API中,我不能change@Drux,我不想让它短暂。我想要反序列化后的信息。我的问题是,如何使其可序列化?列类存在于某些API中,我不能change@PalaniappanMeiyappan这可能是您的解决方案。这将不起作用,列字段将在deserialization@marcin_j这是因为在反序列化不可序列化的基类时,它们的构造函数将被执行,从而导致默认初始化。在ObjectStreamClass.newInstance()中,您可以读取:
创建所表示类的新实例。如果类是可外部化的,则调用其公共无参数构造函数;否则,如果该类是可序列化的,**将调用第一个不可序列化超类的无参数构造函数。**
这看起来也不错。让我试着让你知道。谢谢