2010-01-26 21 views
5

मेरे पास कुछ संग्रहों के साथ एक कक्षा है, और मैं संग्रह को खाली होने के बिना, और IXmlSerializable को लागू किए बिना एक्सएमएल को इस वर्ग के उदाहरणों को क्रमबद्ध करना चाहता हूं। मुझे परवाह नहीं है कि यह खाली तत्व बनाता है, या तत्वों को बिल्कुल नहीं बनाता है। बस यह कि प्रत्येक संग्रह आधारित संपत्ति के लिए संग्रह प्रारंभ किए बिना काम करता है।.NET एक्सएमएल सीरियलाइजेशन और नल कलेक्शन

मैंने उन सभी एक्सएमएल विशेषताओं को देखा है जिनके साथ मैं गुणों को सजाने के लिए, और इसके साथ कोई सफलता नहीं मिली है। यह ऐसा करने के लिए एक साधारण चीज की तरह लगता है जिसमें तत्व हो सकता है या बस कोई भी नहीं। फिर जब इसे deserialized किया जा रहा है तो यह सिर्फ उन्हें शून्य या उन्हें अवधि की अनदेखी छोड़ देगा।

इस मुद्दे के माध्यम से काम करने के लिए उपयोग करने के लिए कक्षा का एक साधारण संस्करण यहां दिया गया है। इस संग्रह का उपयोग करके और डिफॉल्ट को अपवाद प्राप्त होने के कारण "ऑब्जेक्ट रेफरेंस ऑब्जेक्ट के उदाहरण पर सेट नहीं किया गया है";

public class MyClass 
{ 
    public string Name { get; set; } 
    public bool IsAlive { get; set; } 
    public List<Car> Cars { get; set; } 
    public List<Home> Homes { get; set; } 
    public List<Pet> Pets { get; set; } 

    public void ToXmlFile(string fileName) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); 
     TextWriter writer = new StreamWriter(fileName); 
     serializer.Serialize(writer, this); 
     writer.Close(); 
    } 
} 

संपादित के लिए धन्यवाद में मदद करता है दोस्तों, यह पता चला है मुद्दा मेरी GetHashCode विधि में था जो अशक्त सही ढंग से संभाल नहीं किया। एक बार मैंने यह तय कर लिया कि सब अच्छा था। मैंने सही होने के जवाब देने वाले पहले व्यक्ति को चिह्नित किया। रेड हेरिंग के लिए खेद है, लेकिन आपके साथ काम करने से लोगों ने मदद की।

+0

और समस्या क्या है? यह काम करना चाहिए (कम से कम serialize और deserialize); आप क्या पसंद नहीं कर रहे हैं? –

+0

मैं आपके द्वारा प्राप्त अपवाद को पुन: पेश नहीं कर सका। मैं आपके सटीक MyClass के उदाहरण को क्रमबद्ध और deserialize करने में सक्षम था जैसा आपने इसे दिया था। शायद कुछ और चल रहा है? –

+0

@ ब्रायन हाँ कुछ और चल रहा था, सभी त्वरित मदद के लिए धन्यवाद और यह दिखा रहा है कि यह एक्सएमएल कोड ही नहीं था। :) –

उत्तर

5

कक्षा को एक्सएमएल को क्रमबद्ध करने के लिए आपको संग्रह आरंभ करने की आवश्यकता नहीं है। यहाँ यह दर्शाने के लिए एक सरल कार्यक्रम है:

<?xml version="1.0"?> 
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Name>Test</Name> 
    <IsAlive>true</IsAlive> 
</MyClass> 

दूसरे शब्दों में, null संग्रह गुण किसी अन्य null संपत्ति के रूप में एक ही तरह से व्यवहार करते हैं - वे नहीं मिलता है:

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyClass c = new MyClass() { Name = "Test", IsAlive = true }; 
     XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      serializer.Serialize(ms, c); 
      Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
     } 
     Console.ReadLine(); 
    } 
} 

यह निम्न उत्पादन प्रिंट होगा बिल्कुल क्रमबद्ध (जब तक आप डिफ़ॉल्ट मान नहीं बदलते, जो मेरे पास नहीं है)।

+0

मैंने यह प्रश्न अपडेट किया, मुझे यह प्राप्त करते समय "वस्तु संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं किया गया" अपवाद और अपवाद। मैं StreamWriter का उपयोग करके फ़ाइल में ऐसा कर रहा हूं और क्लास पर एक ToXmlFile विधि से कर रहा हूं जो "इस" कीवर्ड का उपयोग करके संदर्भित करने के लिए किस ऑब्जेक्ट को संदर्भित करता है। जेनेरिक सूचियों के लिए परिभाषित कक्षाएं केवल प्राथमिकताओं या enums के साथ सरल हैं। आप क्या कहते हैं कि मैं इसे कैसे काम करने की उम्मीद करता हूं, हालांकि यह नहीं करता है। मैं धारावाहिकरण के लिए इस्तेमाल किए गए कोड के साथ कक्षा को अद्यतन भी करूंगा। –

+0

धन्यवाद, यह मुद्दा कहीं और था क्योंकि ब्रायन ने इस सवाल पर अपनी टिप्पणी में भाग लिया था। –

0

आप बिना किसी समस्या के इसे क्रमबद्ध कर सकते हैं जब आप अतिरिक्त प्रकार पैरामीटर में क्रमबद्ध करते हैं तो आपको कार, घर और पालतू जानवरों के प्रकार भेजना पड़ता है।

0

आप (डी) क्रमिकरण के दौरान अपवाद का उल्लेख करते हैं; आपको क्या करना चाहिए ठीक है (कम से कम, इस सवाल के अनुसार कि आप कैसे परिभाषित करते हैं)।मुझे आश्चर्य है अगर आप वास्तव में है:

public class MyClass 
{ 
    public string Name { get; set; } 
    public bool IsAlive { get; set; } 
    public List<Car> Cars { get; private set; } 
    public List<Home> Homes { get; private set; } 
    public List<Pet> Pets { get; private set; } 
} 

(असामान्य नहीं एक सार्वजनिक सेटर नहीं चाहता करने के लिए)

खैर, XmlSerializer इस बारे में उधम मचाते है; आपको या तो एक सार्वजनिक सेटर की आवश्यकता है, या (जैसा कि हाल ही में किसी ने बताया) नहीं सेटर; उदाहरण के लिए:

public class MyClass 
{ 
    public string Name { get; set; } 
    public bool IsAlive { get; set; } 
    private readonly List<Car> cars = new List<Car>(); 
    public List<Car> Cars { get { return cars; } } 
    private readonly List<Home> homes = new List<Home>(); 
    public List<Home> Homes { get { return homes; } } 
    private readonly List<Pet> pets = new List<Pet>(); 
    public List<Pet> Pets { get { return pets; } } 
} 
0

मैं एक bool के रूप में वर्तमान पद्धति का विरोध करने के आप एक सुरक्षित फैशन में त्रुटियों को संभालने के लिए अनुमति होगी के लिए XMLSerialisation विधि की वापसी प्रकार की स्थापना लगता है:

public bool ToXmlFile(string fileName) 
{ 
    if(fileName != "") 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); 
     TextWriter writer = new StreamWriter(fileName); 
     serializer.Serialize(writer, this); 
     writer.Close(); 
     return true; 
    } 
    return false; 
} 

कौन सा तो इसलिए की तरह इस्तेमाल किया जा सकता है:

if(ToXMLFile) 
{ 
    MessageBox.Show("Save Succesful"); 
} 
else 
(
    MessageBox.Show("Save unsuccesful"); 
) 

यह महज एक कच्चे उदाहरण हालांकि मैं अपने अनुप्रयोगों जब लोआ में एक ऐसी ही विधि का इस्तेमाल किया है है डिंग या डेटा को सहेजना और यह अच्छी तरह से काम करता है, अंत उपयोगकर्ता के लिए एक अच्छा दृश्य संकेतक भी।

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