2014-04-10 67 views
1

假設你有以下結構(簡化):接口實現和Java序列

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應用程序)一直在抱怨在更新模擬上述示例的更新之後無法打開某些序列化對象(即,我只添加了新的可串行化接口實現)。

回答

1

是否應該對序列化的已經有 的MyClass對象有任何影響?

我對你的問題有點困惑,但是如果對象被序列化爲Impl1或Impl2,並且你試圖反序列化爲Impl3 - 這是行不通的。所以結論是,當你將對象序列化爲Impl1時,它必須被反序列化爲Impl1。

順便說一下,特別是在Android - 正式支持和推薦的方式如何「序列化」任何類型的對象是一個使用Parcelable接口。和why to use it

+0

我的意思是你可以在MyClass(interInstance)中有一個可以是Impl1或Impl2(都可序列化)的字段。稍後添加第三個實現(Impl3),現在在MyClass實例中的interInstance可以是Impl1,Impl2或Impl3。問題是這個添加是否可以在從Impl3存在之前創建的文件中讀取序列化對象時產生影響。 – user1987392

+0

@ user1987392這取決於你的影響力。序列化的對象不會改變,但我是如何寫的。如果將對象序列化爲Impl2,則必須將其反序列化爲Impl2,而不是Impl3。 – Sajmon

+0

通過影響我的意思是一個ObjectInputStream仍然能夠讀取序列化對象具有Impl1或Impl2作爲interInstance的(舊)文件。 – user1987392