【问题标题】:Can I wrap a non-serializeable class in a local nested serializeable class?我可以将不可序列化的类包装在本地嵌套的可序列化类中吗?
【发布时间】:2014-12-10 17:43:00
【问题描述】:

我想知道,如果我可以通过将它们包装在本地嵌套类中来欺骗序列化,就像这样:

我有一个需要传递的服务,但它内部有一些非常复杂的数据。

 interface ComplexService {
       IncredibleComplexObject getData();
   }

所以我考虑将它包装在另一个可通过装饰器模式序列化的类中。

public final class Utils {

   public static Serializable wrap(final ComplexService service) {
       class WrapperService implements ComplexService, Serializeable {
           @Override
           public IncredibleComplexData getData() {
                return service.getData();
           }
       };
       return new WrapperService();
   }
}

我实际上不相信我可以像那样欺骗序列化,因为如果 Java 可以真正重新创建依赖于我的最终 ComplexService 参数的类,那就太神奇了。但我想知道,为什么这会失败,会抛出什么异常,在哪里以及为什么。


(只是为了澄清我为什么要这样做:我在android上,我需要将此服务传递给Fragment,它自然只能保存可序列化的对象)。

【问题讨论】:

  • ComplexService 不能也可序列化(即扩展 Serializable)吗?
  • ComplexService 本身不能序列化,因为它的实际实现会将IncredibleComplexObject 缓存在一个字段中,因此不能序列化。
  • IncredibleComplexObject 不能被序列化吗? :P 不管怎样,在你把它包装在 WrapperService 之后,你怎么能从外面调用 getData() 呢?这是一个内部方法类...

标签: java serialization nested-class


【解决方案1】:

是的,您可以将不可序列化的对象包装在可序列化的包装器中。不,它不会神奇地使包装的对象可序列化。如果您尝试序列化包装类(不创建该字段transient),您将获得NotSerializableException

【讨论】:

  • 在我的示例中,我的包装类实际上没有任何字段,所以我希望序列化仍然有效,但反序列化可能会导致异常,我错了吗?
  • 有趣的是,我刚刚尝试过,你是对的 - 反序列化时我没有遇到异常 - 序列化时我已经遇到了异常。为什么我们不应该序列化内部类,在这里描述:stackoverflow.com/a/17805016/1406325
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多