【问题标题】:Interface Implementation and Java Serialization接口实现和Java序列化
【发布时间】:2014-05-23 20:14:56
【问题描述】:

假设你有以下结构(简化):

interface Inter
{
   //...
}

class Impl1 implements Inter, Serializable
{
   private static final long serialVersionUID = ...;
   //...
}

class Impl2 implements Inter, Serializable
{
   private static final long serialVersionUID = ...;
   //...
}

class MyClass implements Serializable {
   private static final long serialVersionUID = ...;
   Inter interInstance; // can be Impl1, Impl2...
}

稍后,您添加一个新的实现:

class Impl3 implements Inter, Serializable
{
   private static final long serialVersionUID = ...;
   //...
}

...最终得到 MyClass.interInstance 可以假设的三个类。

这应该对已经序列化的 MyClass 对象有什么影响吗?

我问这个是因为用户(Android 应用程序)一直抱怨在更新后无法打开某些序列化对象,其中更改模仿了上面的示例(即我只添加​​了一个新的可序列化接口实现) .

【问题讨论】:

    标签: java android serialization serializable


    【解决方案1】:

    应该对已经存在的 MyClass 对象产生任何影响 序列化?

    我对您的问题有点困惑,但是如果对象被序列化为 Impl1 或 Impl2 并且您尝试反序列化为 Impl3 - 这将不起作用。所以结论是当你将对象序列化为 Impl1 时,它必须被反序列化为 Impl1。

    顺便说一句,特别是在 Android 中 - 官方支持和推荐的如何“序列化”任何类型的对象的方法是使用 Parcelable 接口。还有why to use it

    【讨论】:

    • 我的意思是你可以在 MyClass (interInstance) 中有一个字段,它可以是 Impl1 或 Impl2(都可序列化)。稍后您添加第三个实现 (Impl3),现在 MyClass 实例中的 interInstance 可以是 Impl1、Impl2 或 Impl3。问题是这种添加是否会在从 Impl3 存在之前创建的文件中读取序列化对象时产生影响。
    • @user1987392 这取决于您所说的影响力。序列化的对象不会改变,但我是如何写的。如果您将对象序列化为 Impl2,则它也必须反序列化为 Impl2 而不是例如 Impl3。
    • 通过影响,我的意思是 ObjectInputStream 仍然能够读取序列化对象具有 Impl1 或 Impl2 作为其 interInstance 的(旧)文件。
    • @user1987392 我认为不会有问题。
    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    相关资源
    最近更新 更多