如何序列化引用泛型类型的非可序列化对象的对象?

时间:2015-07-24 12:40:10

标签: java object serialization

我有一个包含非序列化对象的对象。

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 partshttps://dzone.com/articles/serializing-java-objects-non 答案非常有趣,但无法解决我的问题。 首先,insideObject是一个来自库的类,我无法添加可序列化的实现。 在dzone网页上给出的答案也很有趣(编写自己的writeObject方法)。 但正如您所看到的,insideObject是一个泛型类,我们可以在bigObject中的smallObject上获得几种类型的insideObject,因此这个解决方案是不可能的。

那么,是否有可能以另一种方式解决这个问题? 也许我可以以某种方式在现有对象上添加serializable的实现?或者只有Kyro的外部图书馆可以帮我解决问题?

4 个答案:

答案 0 :(得分:0)

您应该尝试实施 Externalizable 界面,而不是 Serializable

然后您需要覆盖 writeExternal

readExternalExternalizable方法
public void writeExternal(ObjectOutput out) throws IOException  {
    out.writeObject(urObject);
    }

答案 1 :(得分:0)

这就是为什么java有Transient关键字的权利? 将不可序列化的变量声明为瞬态变量,您的问题将得到解决。 即     private transient T insideObject;

答案 2 :(得分:0)

在您不希望合并到序列化的任何字段之前使用transient

标准序列化程序将通过该字段。

答案 3 :(得分:0)

我认为来自dzone的例子可以帮到你。

一种方法是使用BigObject作为抽象基类,并为每个smallObject案例创建子类,根据您发布的示例处理它们自己的序列化/解除序列化逻辑。

另一个是坚持单个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最佳实践。