【问题标题】:How to serialize an object referencing a non-serializble object of generic type?如何序列化引用泛型类型的不可序列化对象的对象?
【发布时间】:2015-10-15 03:24:27
【问题描述】:
我有一个内部包含不可序列化对象的对象。
class object BigObject<T extends smallObject> implements Serializable{
private T insideObject;
public BigObject(T insideObject) {this.insideObject = insideObject;}
}
我想序列化 Big 对象,但由于显而易见的原因,我得到 java.io.NotSerializableException 错误。
我阅读的主题如下:Java Serialization with non serializable parts
或https://dzone.com/articles/serializing-java-objects-non
答案很有趣,但无法解决我的问题。
首先 insideObject 是一个库中的类,我无法添加可序列化的实现。
dzone 网页上给出的答案也很有趣(编写自己的 writeObject 方法)。
但是可以看到,insideObject 是一个泛型类,我们可以在 bigObject 中得到一些在 smallObject 上扩展的 insideObject,所以这种方案是不可能的。
那么,是否可以通过其他方式来解决这个问题?
也许我可以以某种方式在现有对象上添加可序列化的实现?还是只有 Kyro 这样的外部库可以帮助我解决我的问题?
【问题讨论】:
标签:
java
object
serialization
【解决方案1】:
你应该尝试实现Externalizable接口而不是Serializable
那你需要重写Externalizable的writeExternal和readExternal方法
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(urObject);
}
【解决方案2】:
这就是为什么 java 有 Transient 关键字的原因吧?
将不可序列化的变量声明为瞬态,您的问题将得到解决。
IE。
私有瞬态 T insideObject;
【解决方案3】:
在您不想被合并到序列化中的任何字段之前使用transient。
标准序列化程序将通过该字段。
【解决方案4】:
我认为来自 dzone 的示例可以帮助您。
一种方法是使用 BigObject 作为抽象基类,并按照您发布的示例为处理自己的序列化/反序列化逻辑的每个小对象创建子类。
另一个是坚持单个 BigObject 类,但是,在序列化过程中,您还可以序列化具体 smallObject 实例的类名。然后在反序列化期间,您可以相应地修改逻辑。
private void writeObject(final ObjectOutputStream out) throws IOException {
out.writeUTF(this.insideObject.getClass().getCanonicalName());
// serialize this.insideObject
}
private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
String insideClassName = in.readUTF();
// choose logic based on class name
}
我个人会采用第一种方法,因为它会保持代码更简洁并坚持 OOP 最佳实践。