正如其他人指出的那样,Josh Bloch的Effective
Java的第11章是有关Java序列化的必不可少的资源。
该章中与您的问题有关的几点:
- 假设您要序列化MyClass2中不可序列化字段的状态,则MyClass必须可以直接访问该字段,也可以通过getter和setter对其进行访问。MyClass必须通过提供readObject和writeObject方法来实现自定义序列化。
- 不可序列化字段的类必须具有一个API,以允许获取其状态(用于写入对象流),然后实例化具有该状态的新实例(稍后从对象流中读取时)。
- 根据有效Java的第74项,MyClass2 必须 具有MyClass可访问的no-arg构造函数,否则MyClass不可能扩展MyClass2并实现Serializable。
我在下面写了一个简单的例子来说明这一点。
class MyClass extends MyClass2 implements Serializable{ public MyClass(int quantity) { setNonSerializableProperty(new NonSerializableClass(quantity)); } private void writeObject(java.io.ObjectOutputStream out) throws IOException{ // note, here we don't need out.defaultWriteObject(); because // MyClass has no other state to serialize out.writeInt(super.getNonSerializableProperty().getQuantity()); } private void readObject(java.io.ObjectInputStream in) throws IOException { // note, here we don't need in.defaultReadObject(); // because MyClass has no other state to deserialize super.setNonSerializableProperty(new NonSerializableClass(in.readInt())); }}class MyClass2 { private NonSerializableClass nonSerializableProperty; public void setNonSerializableProperty(NonSerializableClass nonSerializableProperty) { this.nonSerializableProperty = nonSerializableProperty; } public NonSerializableClass getNonSerializableProperty() { return nonSerializableProperty; }}class NonSerializableClass{ private final int quantity; public NonSerializableClass(int quantity){ this.quantity = quantity; } public int getQuantity() { return quantity; }}


