【问题标题】:Wrapping non serializable type with serializable function用可序列化函数包装不可序列化类型
【发布时间】:2019-07-24 00:38:30
【问题描述】:

给定:

trait SomeTypeNotSerializable
trait ValueProvider[T] extends java.io.Serializable {
  def get: T
}

ValueProvider[SomeTypeNotSerializable] 可以序列化吗?有没有办法通过用函数包装对象来解决不可序列化的问题?

【问题讨论】:

    标签: java scala serialization


    【解决方案1】:

    根据规则,它是Serializable,但如果你将T 存储为非瞬态字段,它将在运行时失败。如果T 是瞬态的或不受字段支持(例如,在每次调用get 时创建),那么您应该没问题,尽管我仍然很好奇您为什么要序列化一个服务对象,它这不是通常的做法。

    【讨论】:

    • 它不是我试图提供的服务对象,它是一个设计不良且不可序列化的第三方对象。
    【解决方案2】:

    据我所知,ValueProvider[SomeTypeNotSerializable] 在这种情况下是不可序列化的。

    这可以通过下面的示例代码进行检查,运行时会打印:

    testString is Serializable
    st2 is Serializable
    

    主类:

    import java.io.Serializable;
    
    public class Main {
    
        public static void main(String[] args) {
    
            NonSerializableThing nst = new NonSerializableThing();
    
            SerializableThing<NonSerializableThing> st = new SerializableThing<>();
            st.set(nst);
    
            if(nst instanceof Serializable) { // always false
                System.out.println("nst is Serializable");
            }
    
            if(st.get() instanceof Serializable) {
                System.out.println("st is Serializable");
            }
    
            String testString = "testString";
            SerializableThing<String> st2 = new SerializableThing<>();
            st2.set(testString);
    
            if(testString instanceof Serializable) { // always true
                System.out.println("testString is Serializable");
            }
    
            if(st2.get() instanceof Serializable) {
                System.out.println("st2 is Serializable");
            }
    
        }
    }
    

    其他类型:

    public class NonSerializableThing {
    
        NonSerializableThing() {}
    }
    
    public class SerializableThing<T> implements java.io.Serializable {
    
        public T t;
    
        public SerializableThing() { }
    
        public void set(T t) {this.t = t;}
        public T get() {return t;}
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 2019-06-25
      • 2018-11-22
      • 1970-01-01
      相关资源
      最近更新 更多