मैं XDocument को उस वर्ग में deserialize करने का प्रयास कर रहा हूं जिसमें एक सरणी/सूची है। समस्या यह है कि यह कोड ऐसा करने में विफल रहता है, मुझे हमेशा Response बिना किसी इन्वेंटरी आइटम के वर्ग मिलता है (शून्य नहीं, लेकिन गिनती = 0)

यहाँ मेरी परीक्षण विधि है:

public void GetObj()
{
    var xe = new XElement("Inventory");
    var xe2 = new XElement("Id", "23");
    xe.Add(xe2);

    var list = new List<XElement>();
    list.Add(xe);
    list.Add(xe);

    var doc = new XDocument(new XElement("Response", list));

    var obj = doc.Deserialize<Response>();
}

और यहाँ मेरी विस्तार विधियाँ और मॉडल हैं:

public static class XDocumentExtensions
{
    public static T Deserialize<T>(this XDocument doc)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

        using (var reader = doc.Root.CreateReader())
        {
            return (T)xmlSerializer.Deserialize(reader);
        }
    }

    public static XDocument Serialize<T>(this T value)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

        XDocument doc = new XDocument();
        using (var writer = doc.CreateWriter())
        {
            xmlSerializer.Serialize(writer, value);
        }

        return doc;
    }
}

public class Response
{
    public List<Inventory> Inventory { get; set; }
}

public class Inventory
{
    public int Id { get; set; }
}
2
mko 16 नवम्बर 2018, 11:37

1 उत्तर

सबसे बढ़िया उत्तर

एक्सएमएल अक्रमांकन के साथ किसी समस्या का निदान करने का सबसे आसान तरीका स्मृति में अपने मॉडल का एक उदाहरण बनाना और इसे क्रमबद्ध करना है, फिर आउटपुट एक्सएमएल की वांछित इनपुट के साथ तुलना करना है। इस प्रकार, अगर मैं करता हूं:

Console.WriteLine(new Response { Inventory = new List<Inventory> { new Inventory { Id = 23 } } }.Serialize() );

आउटपुट एक्सएमएल है:

<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Inventory>
    <Inventory>
      <Id>23</Id>
    </Inventory>
  </Inventory>
</Response>

जैसा कि आप देख सकते हैं, <Inventory> तत्वों के नेस्टिंग का एक अतिरिक्त स्तर है। ऐसा इसलिए है क्योंकि, डिफ़ॉल्ट रूप से, XmlSerializer एक बाहरी कंटेनर तत्व तत्व के साथ संग्रह को क्रमबद्ध करता है जिसका नाम क्रमबद्ध सदस्य (यहां Inventory) के साथ-साथ प्रत्येक आइटम के लिए एक तत्व है, जिसका नाम (डिफ़ॉल्ट रूप से) है। आइटम का प्रकार (यहां भी Inventory)। डेमो फिडल #1 यहां

यदि आप यह नहीं चाहते हैं, तो आपको जोड़ना होगा [XmlElement] से public List<Inventory> इस तरह:

public class Response
{
    [XmlElement]
    public List<Inventory> Inventory { get; set; }
}

अब Inventory बाहरी कंटेनर तत्व के बिना क्रमबद्ध किया जाएगा, और इसलिए आपका अक्रमांकन कोड सफल होगा। डेमो फिडल #2 यहां

(वैकल्पिक रूप से, आप अपने XDocument को नेस्टिंग के अपेक्षित अतिरिक्त स्तर के साथ बना सकते हैं।)

2
dbc 16 नवम्बर 2018, 09:00