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

那么,是否可以通过其他方式来解决这个问题? 也许我可以以某种方式在现有对象上添加可序列化的实现?还是只有 Kyro 这样的外部库可以帮助我解决我的问题?

【问题讨论】:

    标签: java object serialization


    【解决方案1】:

    你应该尝试实现Externalizable接口而不是Serializable

    那你需要重写ExternalizablewriteExternalreadExternal方法

    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 最佳实践。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-14
            • 1970-01-01
            • 2016-05-15
            • 2012-01-29
            • 1970-01-01
            • 2011-02-17
            • 1970-01-01
            相关资源
            最近更新 更多