【问题标题】:Deserialize a transient member of an object to a non-null default use Kryo将对象的瞬态成员反序列化为非空默认使用 Kryo
【发布时间】:2017-12-18 07:35:49
【问题描述】:
public class MyObj implements Serializable {
    private transient Map<String, Object> myHash = new HashMap<String, Object>();
    ...
}

我发现了这个问题

Deserialize a transient member of an object to a non-null default in Java

但是在java中使用标准的反序列化,它可以工作。但它似乎没有在 kryo 中调用 readObject

【问题讨论】:

    标签: java serialization kryo


    【解决方案1】:

    何时调用 objectInputStream.readObject();在读取您保存的对象(从文件)时,将调用 MyObj 的 readObject()(如果存在)。

    您不需要在 MyObj 的对象上显式调用该方法(MyObj 的 readObject())..

    【讨论】:

    • 我明白不需要调用那个方法,但是如果kryo不会像java标准反序列化那样调用那个方法,它就没有机会保证瞬态对象不为空
    【解决方案2】:

    您可以简单地使用扩展可序列化并覆盖其 writeExternal() 方法的可外部化接口。

    Class abc implements Externalizable
      {
        transient String name;
        private int age;
    
        public abc(){ }
        public void writeExternal(ObjectOutput out)       throws IOException
        {
     out.writeObject(name);
     out.writeInt(age);
    
             }
         public void readExternal(ObjectInput in) throws   IOException,ClassNotFoundException
        { 
     name=(String)in.readObject(name);
     age=(in.readInt(age);
    
              }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      相关资源
      最近更新 更多