2012-07-25 67 views
4

我試圖像如下序列化類型:如果實現對象不是Serializable,那麼如何序列化基礎對象?

public UsersPanel(UsersVM userVm) 
    { 
     var serialized = Serialize(userVm); 
    } 

    public static string Serialize(ViewModelBase instance) 
    { 
     var formatter = new BinaryFormatter(); 
     using (var stream = new MemoryStream()) 
     { 
      formatter.Serialize(stream, instance); // breaks here 
      return Convert.ToBase64String(stream.ToArray()); 
     } 
    } 

UsersVM被定義爲

public class UsersVm : ViewModelBase {} 

ViewModelBase被定義爲

[Serializable] 
public class ViewModelBase {} 

這是給我下面的錯誤:

Type 'UsersVM' is not marked as serializable.

爲什麼它告訴我,如果我已將對象userVm轉換爲ViewModelBase(其中標記爲可序列化),將其傳遞到Serialize(ViewModelBase instance)

我認爲在將UsersVM傳遞給需要ViewModelBase的方法時,UsersVM將被基類型ViewModelBase取代。

如何序列化ViewModelBase?

+0

當你序列化的時候,你是否嘗試過轉換爲基礎對象?例如var serialized = Serialize(userVm作爲ViewModelBase); – Jonathan 2012-07-25 16:09:45

+0

@Jonathan:不幸的是BinaryFormatter仍然會抱怨,因爲基類沒有標記爲可序列化。 – 2012-07-25 16:10:38

+0

或者只是實現ISerializable?嘗試在你的課堂上寫[Serializable]。如果這對你有幫助,我會很樂意提供它作爲答案。 – 2012-07-25 16:10:42

回答

5

解決伊核問題

你必須標記你的派生類爲可序列化,太

[Serializable] 
public class UsersVm : ViewModelBase {} 

爲什麼你必須這樣做

的BinaryFormatter的着眼於實際在序列化時輸入對象實例的。演員只是告訴編譯器將實例視爲這是一個不同的類型,但實際上並沒有將實例更改爲該類型。

旁註

我最初讀的問題向後找到了答案,逆問題,有趣的和潛在有用的人......

注意,如果情況相反(底座類沒有被標記爲可序列化,並且你沒有訪問源代碼),你仍然可以實現你的目標。

the subclass can implement ISerializable, use reflection to read and serialize the base classes' fields, and use reflection again to set these fields during deserialization

http://msdn.microsoft.com/en-us/magazine/cc163902.aspx#S14

的文章提供了一個代碼示例,包括工具,以幫助實現這種方法。