我有一个包含非序列化对象的对象。
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,因此这个解决方案是不可能的。
那么,是否有可能以另一种方式解决这个问题? 也许我可以以某种方式在现有对象上添加serializable的实现?或者只有Kyro的外部图书馆可以帮我解决问题?
答案 0 :(得分:0)
您应该尝试实施 Externalizable
界面,而不是 Serializable
然后您需要覆盖 writeExternal
readExternal
和Externalizable
方法
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最佳实践。