2012-04-23 27 views
5

मैं XmlSerializer साथ क्रमबद्धता का एक बहुत ही सरल सा करने के लिए कोशिश कर रहा हूँ:, जबसेटर नहीं कहा जब deserializing संग्रह

<?xml version="1.0" encoding="utf-8"?> 
<GroupOfPeople xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <_XmlPeople> 
     <XmlPerson Id="person1" Name="Fred" /> 
     <XmlPerson Id="person2" Name="Bill" /> 
     <XmlPerson Id="person3" Name="Andy" /> 
     <XmlPerson Id="person4" Name="Nagesh" /> 
    </_XmlPeople> 
</GroupOfPeople> 

हालांकि:

public struct XmlPerson 
{ 
    [XmlAttribute] public string Id { get; set; } 
    [XmlAttribute] public string Name { get; set; } 
} 

public class GroupOfPeople 
{ 
    private Dictionary<string, string> _namesById = new Dictionary<string, string>(); 

    //pseudo property for serialising dictionary to/from XML 
    public List<XmlPerson> _XmlPeople 
    { 
     get 
     { 
      var people = new List<XmlPerson>(); 
      foreach (KeyValuePair<string, string> pair in _namesById) 
       people.Add(new XmlPerson() { Id = pair.Key, Name = pair.Value }); 

      return people; 
     } 
     set 
     { 
      _namesById.Clear(); 
      foreach (var person in value) 
       _namesById.Add(person.Id, person.Name); 
     } 
    }  
} 

सहेजा जा रहा है इस वर्ग के ठीक काम करता है, और मैं मिल मैंने फ़ाइल में फिर से पढ़ा है, मेरे _XmlPeople प्रॉपर्टी सेटर को कभी नहीं कहा जाता है, और इस प्रकार शब्दकोश खाली है। इस वस्तु पर अन्य सभी गुणों को deserialized ठीक मिलता है।

क्या मुझे कुछ याद आ रही है? मैंने विभिन्न संग्रह प्रकारों की कोशिश की है, लेकिन उनमें से कोई भी deserialize।

संपादित: पढ़ें कोड:

try 
{ 
    using (var stream = new StreamReader(itemPath)) 
    { 
     var xml = new XmlSerializer(typeof(GroupOfPeople)); 
     GroupOfPeople item = (GroupOfPeople)xml.Deserialize(stream); 
    } 
} 
//snip error stuff 
+0

आप कैसे पढ़ते हैं? – Tigran

+0

कोड के साथ संपादित किया गया है। – GazTheDestroyer

+0

सेटटर कभी नहीं कहा जाता है। मेरे पास एक ब्रेकपॉइंट है। – GazTheDestroyer

उत्तर

2

आप XmlArray विशेषता का उपयोग कर की कोशिश की?

अपने उदाहरण के साथ

यह कुछ इस तरह होगा:

[XmlArray] 
[XmlArrayItem(ElementName="XmlPerson")] 
public List<XmlPerson> XmlPeople 

संपादित करें:

public struct XmlPerson 
{ 
    [XmlAttribute] public string Id { get; set; } 
    [XmlAttribute] public string Name { get; set; } 
} 


public class GroupOfPeople 
{ 
    [XmlArray] 
    [XmlArrayItem(ElementName="XmlPerson")] 
    public List<XmlPerson> XmlPeople { get; set; } 
} 

मैं इसे नहीं लगता कि यह करेगा:

यहाँ, निम्नलिखित संरचना की कोशिश सूची के सेटर में कोड जोड़ने के लिए आसान हो, तो जब आपको वास्तव में इसकी आवश्यकता हो तो उस शब्दकोश को प्राप्त करने के बारे में क्या?

इस तरह

:

private Dictionary<string, string> _namesById; 

public Dictionary<string, string> NamesById 
{ 
    set { _namesById = value; } 
    get 
    { 
     if (_namesById == null) 
     { 
      _namesById = new Dictionary<string, string>(); 

      foreach (var person in XmlPeople) 
      { 
       _namesById.Add(person.Id, person.Name); 
      } 
     } 

     return _namesById; 
    } 
} 

इस तरह आप एक्सएमएल से आइटम मिल जाएगा और यह भी mantain होगा कि तुम्हारा शब्दकोश। स्पष्टता के लिए

+0

नहीं। बचत करते समय विशेष रूप से पहचाने जाने वाले गुण, लेकिन अभी भी कोई लोड नहीं। :/ – GazTheDestroyer

+0

@GazTheDestroyer ने कुछ कोड नमूना शामिल करने के लिए उत्तर संपादित किया। – Smur

+0

कुछ डीबग कर रहे थे (मेरा जवाब देखें), लेकिन आपने अपना जवाब सही के रूप में सेट किया है क्योंकि इससे समस्या हल हो जाती है। अगर किसी और को समस्या हो तो बस स्पष्टता के लिए मेरा जवाब दें। – GazTheDestroyer

13

उत्तर:

कुछ डिबगिंग किया और पाया कि XmlSerializer एक संग्रह के लिए सेटर फोन नहीं करता है।

इसके बजाय गेटर पर कॉल किया गया है, और फिर संग्रहित संग्रह में आइटम जोड़ता है। इस प्रकार फेलिप जैसे समाधान आवश्यक है।