2013-10-31 8 views
6

मान लीजिए मैं इस वर्ग के लिए किया था:वस्तु के एक पुराने संस्करण से एक वस्तु के एक नए संस्करण deserializing

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

इस वर्ग के धारावाहिक हो जाता है जब आवेदन बंद कर देता है, और अगले रन पर deserialized हो जाता है।

फिर, मैं इसे बनाया गया है और आवेदन जारी किया गया है, और अब वर्ग बदल गया है:

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

वहाँ मामले में अक्रमांकन पर उसके डिफ़ॉल्ट करने के लिए एक गुण सेट करने के लिए एक तरह से अपने पुराने धारावाहिक में नहीं मिला है आपत्ति?

एक तरह से मैंने कक्षा के पुराने संस्करण को रखने के बारे में सोचा था, फिर उस संस्करण को जांचें जो क्रमबद्ध था, फिर पुरानी वस्तु के गुणों को लूपिंग और उन्हें नई वस्तु में स्थापित करना, लेकिन यह मेरे लिए कोई समझ नहीं है, कोई अन्य समाधान जो समझ में आता है?

+0

क्या धारावाहिक? ऐसे इंटरफ़ेस/विशेषताएँ हैं जिनका उपयोग आप ऑब्जेक्ट [डी] धारावाहिक को संशोधित करने के लिए कर सकते हैं लेकिन यह किस लाइब्रेरी पर निर्भर है। –

+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

का उपयोग करके एक परीक्षण नमूना जोड़ा है, लेकिन '[ऑनडिसेरियलाइज्ड()] 'के बिना डिफ़ॉल्ट मान निर्दिष्ट करने का कोई तरीका नहीं है, है ना? मैंने बैकिंग फील्ड वैल्यू सेट करके कोशिश की लेकिन उसने 10 के बजाय 0 दिया, लेकिन '[ऑनडिसेरियलाइज्ड()] ' – FPGA

+1

के साथ ठीक काम किया जहां तक ​​मुझे पता है कि एक और तरीका है। आप [ISerializable इंटरफेस] को लागू कर सकते हैं (http://msdn.microsoft.com/en-US/library/System.Runtime.Serialization.ISerializable%28v=vs.110%29।एएसपीएक्स) जो आपको GetObjectData (जिसे धारावाहिक प्रक्रिया में उपयोग किया जाता है) को लागू करने के लिए मजबूर करता है और आपको दो पैरामीटर (SerializationInfo जानकारी, स्ट्रीमिंग कॉन्टेक्स्ट संदर्भ) के साथ एक अतिरिक्त कन्स्ट्रक्टर को भी लागू करने की आवश्यकता होती है जिसका उपयोग deserialization प्रक्रिया के दौरान किया जाएगा। वहां आप अपने क्षेत्र/संपत्ति का मूल्य भी निर्धारित कर सकते हैं लेकिन मेरी राय में यह जटिल है। –

+0

मैं इस के साथ रहूंगा, इसका सही धन्यवाद – FPGA

2

मैं जो कुछ करता हूं वह उस क्षेत्र पर कुछ INT आधार है जहां फ़ील्ड का डिफ़ॉल्ट मान होता है। अर्थात।

public class SomeClass 
{ 
    public SomeClass() { } 

    int someInt = 10; 

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

फिर जब serializer वस्तु deserializes अगर SomeInt मूल्य प्रदान नहीं की है डिफ़ॉल्ट मान अभी भी स्थापित किया जाएगा।

संपादित करें: अद्यतन

जोड़ा गया एक्सएमएल serializer का उपयोग कर एक नमूना अनुप्रयोग। अब वर्ग प्रकार टॉगल करने के लिए बस पंक्ति में #define serialize बयान uncomment 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

जितना आसान नहीं सोचा था, यह इसे निराश कर दिया गया था, लेकिन कुछ मूल्य 10 के बजाय 0 था! – FPGA

+0

मैंने कोशिश की कि कई प्रकार के साथ, और मुझे deserializing के बाद क्या मिलता है फ़ील्ड – FPGA

संबंधित मुद्दे