[C#] अप्रचलित विशेषता के कारण संपत्ति XmlSerialization द्वारा अनदेखा किया जा सकता है


Answers

एक और वैकल्पिक हल है XmlSerializer.UnknownElement की सदस्यता लेने के लिए, डेटाटाइप के लिए serializer बनाते समय, और उसके बाद पुराने डेटा को ठीक करें।

http://weblogs.asp.net/psteele/archive/2011/01/31/xml-serialization-and-the-obsolete-attribute.aspx

शायद डेटाटाइप के लिए क्लास पर एक स्थिर विधि के रूप में सदस्यता लेने की विधि पर विचार करें।

static void serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
    if( e.Element.Name != "Hobbies")
    {
        return;
    }

    var target = (MyData) e.ObjectBeingDeserialized;
    foreach(XmlElement hobby in e.Element.ChildNodes)
    {
        target.Hobbies.Add(hobby.InnerText);
        target.HobbyData.Add(new Hobby{Name = hobby.InnerText});
    }
}
Question

मैं कुछ ऑब्जेक्ट्स को पुनर्रचना कर रहा हूं जो XML को सीरियल कर रहे हैं लेकिन पीछे की संगतता के लिए कुछ गुण रखने की ज़रूरत है, मेरे पास एक ऐसा तरीका है जो पुराने ऑब्जेक्ट को मेरे लिए नए में परिवर्तित करता है और अप्रचलित संपत्ति को रद्द कर देता है मैं अन्य डेवलपर्स को इस संपत्ति का उपयोग न करने के लिए कहने के लिए Obsolete विशेषता का उपयोग करना चाहता हूं लेकिन यह XmlSerializer द्वारा संपत्ति को अनदेखा कर रहा है।

समान कोड:

[Serializable]
public class MySerializableObject
{
    private MyObject _oldObject;
    private MyObject _anotherOldObject;

    private MyObject _newBetterObject;

    [Obsolete("Use new properties in NewBetterObject to prevent duplication")]
    public MyObject OldObject
    {
      get { return _oldObject; }
      set { _oldObject = value; }
    }

    [Obsolete("Use new properties in NewBetterObject to prevent duplication")]
    public MyObject AnotherOldObject
    {
      get { return _anotherOldObject; }
      set { _anotherOldObject = value; }
    }

    public MyObject NewBetterObject
    {
      get { return _anotherOldObject; }
      set { _anotherOldObject = value; }
    } 
}

एक वैकल्पिक हल पर कोई विचार? मेरा सबसे अच्छा समाधान XML टिप्पणियों में अप्रचलित लिखना है ...

अद्यतन: मैं .NET 2.0 का उपयोग कर रहा हूँ




हां, मैं "अप्रचलित" नाम के साथ चीजों को चिह्नित करने से सहमत हूं, हम इसे ऐनम मूल्यों के साथ करते हैं

/// <summary>
/// Determines the swap file location for a cluster.
/// </summary>
/// <remarks>This enum contains the original text based values for backwards compatibility with versions previous to "8.1".</remarks>
public enum VMwareClusterSwapFileLocation
{

    /// <summary>
    /// The swap file location is unknown.
    /// </summary>
    Unknown = 0,

    /// <summary>
    /// The swap file is stored in the virtual machine directory.
    /// </summary>
    VmDirectory = 1,

    /// <summary>
    /// The swap file is stored in the datastore specified by the host.
    /// </summary>
    HostLocal = 2,

    /// <summary>
    /// The swap file is stored in the virtual machine directory. This value is obsolete and used for backwards compatibility.
    /// </summary>
    [XmlElement("vmDirectory")]
    ObseleteVmDirectory = 3,

    /// <summary>
    /// The swap file is stored in the datastore specified by the host. This value is obsolete and used for backwards compatibility.
    /// </summary>
    [XmlElement("hostLocal")]
    ObseleteHostLocal = 4,




}



मैं इस के साथ बहुत संघर्ष किया है - मैन्युअल रूप से सीरियलाइज करने या दूसरे सीरियलइज़र का उपयोग करने के अलावा कोई हल नहीं है।

हालांकि, प्रत्येक अप्रचलित संपत्ति के लिए शिम लिखने के बजाय, जो जल्दी से दर्द हो जाता है, आप संपत्ति नामों के लिए एक Obsolete उपसर्ग जोड़ने पर विचार कर सकते हैं (जैसे Foo ObsoleteFoo Foo हो जाता है। यह विशेषता की तरह एक संकलक चेतावनी उत्पन्न नहीं करेगा, लेकिन कम से कम यह दृश्यमान है कोड।