2013-10-31 82 views
6

假如我有這個類:從舊版本的對象的反序列化對象的新版本

[Serializable] 
public class SomeClass 
{ 
    public SomeClass() {//init} 
    public string SomeString {get;set;} 
} 

在應用程序關閉時,這個類被序列化和反序列化得到的下一次運行。

然後,我建立併發布了應用程序,現在類已更改:

[Serializable] 
public class SomeClass 
{ 
    public SomeClass() {//init} 
    public string SomeString {get;set;} 
    public int SomeInt {get;set;} 
} 

有沒有一種方法來設置屬性其默認值的情況下,反序列化它不是在舊序列中發現目的?

我想過的一種方式是保留舊版本的類,然後檢查已序列化的版本,然後循環舊對象的屬性並將它們設置在新對象中,但這對我來說是無意義的,任何其他有意義的解決方案?

+0

什麼串行器?有些接口/屬性可用於修改對象[de]序列化的方式,但取決於哪個庫。 –

+0

@BradChristie我使用'BinaryFormatter' – FPGA

+1

看一看使用自定義[膠粘劑](http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.binder (v = vs.110)的.aspx) –

回答

4

您可以用屬性

[OptionalField()] 

Version Tolerant Serialization

然後,該類會是什麼樣子作爲解釋標記領域這個:

[Serializable()] 
public class SomeClass 
{ 
    public SomeClass() {//init} 
    public string SomeString { get; set; } 

    [OptionalField(VersionAdded = 2)] 
    public int SomeInt { get; set; } 


    [OnDeserialized()] 
    private void SetValuesOnDeserialized(StreamingContext context) 
    { 
     this.SomeInt = 10; 
    } 
} 
+0

但有沒有辦法指定默認值的測試樣品,不'[OnDeserialized()]',對不對?我試着通過設置後臺字段值,但它給了0而不是10,但與'[OnDeserialized()]' – FPGA

+1

正常工作據我所知只有一種方式。你可以實現[ISerializable接口](http://msdn.microsoft.com/en-US/library/System.Runtime.Serialization.ISerializable%28v=vs.110%29。aspx),它強制你實現方法GetObjectData(在序列化過程中使用),還需要實現一個附加的構造函數,它帶有兩個參數(SerializationInfo info,StreamingContext context),這些參數將在反序列化過程中使用。在那裏,你也可以設置你的領域/財產的價值,但在我看來這是相當複雜的。 –

+0

我會堅持這一個,它的完美謝謝 – FPGA

2

什麼,我會做的是基礎在哪裏領域具有默認值的字段的SomeInt。 IE瀏覽器。

public class SomeClass 
{ 
    public SomeClass() { } 

    int someInt = 10; 

    public string SomeString { get; set; } 
    public int SomeInt 
    { 
     get { return someInt; } 
     set { someInt = value; } 
    } 
} 

然後,如果沒有提供SomeInt值,串行器反序列化對象時默認值仍然設置。

編輯:更新

添加使用XML序列化的樣本應用程序。現在來切換類類型簡單地取消對#define serialize聲明中排2

//uncomment for serialization 
//#define serialize 

using System; 
using System.IO; 
using System.Xml.Serialization; 

namespace TestSerializer 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

#if serialize 

      SomeClass some = new SomeClass(); 
      some.SomeString = "abc"; 

      XmlSerializer serializer = new XmlSerializer(some.GetType()); 
      using (StringWriter writer = new StringWriter()) 
      { 
       serializer.Serialize(writer, some); 
       File.WriteAllText("D:\\test.xml", writer.ToString()); 
      } 
#else 
      XmlSerializer serializer = new XmlSerializer(typeof(SomeClass)); 
      using (StringReader reader = new StringReader(File.ReadAllText("D:\\test.xml"))) 
      { 
       var o = serializer.Deserialize(reader) as SomeClass; 
       if (o != null) 
        Console.WriteLine(o.SomeInt); 
      } 
      Console.ReadKey(); 
#endif 
     } 
    } 



#if serialize 

    [Serializable] 
    public class SomeClass 
    { 
     public SomeClass() { } 
     public string SomeString { get; set; } 
    } 
#else 

    [Serializable] 
    public class SomeClass 
    { 
     public SomeClass() { } 
     private int someInt = 10; 


     public string SomeString { get; set; } 
     public int SomeInt 
     { 
      get { return someInt; } 
      set { someInt = value; } 
     } 
    } 
#endif 
} 
+0

讓我試,我不認爲它的那樣簡單 – FPGA

+0

它沒有反序列化,但someInt值爲0,而不是10! – FPGA

+0

我嘗試了利用多種類型,什麼反序列化後,我得到的是該類型的默認值,而不是在場上 – FPGA