2011-10-26 12 views
9

मेरे पास एक वर्ग है:एक्सएम दस्तावेज़ लेते हुए एक कन्स्ट्रक्टर का उपयोग करके एक्सएमएल को किसी ऑब्जेक्ट में कैसे deserialize?

public class MyClass 
{ 
    public MyClass(){} 
} 

मैं एक एक्सएमएलएसरलाइज़र का उपयोग सीधे कन्स्ट्रक्टर में एक्सडोक्यूलेट को डिसेरियलाइज़ करने में सक्षम होना चाहता हूं:

public class MyClass 
{ 
    private XmlSerializer _s = new XmlSerializer(typeof(MyClass)); 

    public MyClass(){} 
    public MyClass(XDocument xd) 
    { 
     this = (MyClass)_s.Deserialize(xd.CreateReader()); 
    } 
} 

सिवाय इसके कि मुझे "यह असाइन करने की अनुमति नहीं है "निर्माता के भीतर।

क्या यह संभव है?

+0

क्या कारण आप ऐसा करना चाहते हैं के लिए? – Fischermaen

+0

क्योंकि कक्षा को तुरंत चालू करना और इसे एक एक्सडी दस्तावेज़ को खिलाना अच्छा लगेगा और इसे स्वयं इस तरह स्थापित कर दिया है। अन्य समाधान हैं लेकिन यह मेरे लिए सबसे सुंदर लगता है ... मैं बेहतर सुझावों के लिए खुला हूं। –

+0

क्या आप कक्षा को क्रमबद्ध करने के लिए कक्षा सेट अप नहीं कर सकते हैं, इस प्रकार आपके लिए उदाहरण बना सकते हैं? – Yatrix

उत्तर

26

नहीं, यह संभव नहीं है। जब वे deserialize जब serializers वस्तुओं बनाते हैं। आप पहले ही एक वस्तु बना चुके हैं। इसके बजाय, XDocument से निर्माण करने के लिए एक स्थिर विधि प्रदान करें।

public static MyClass FromXml (XDocument xd) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(MyClass)); 
    return (MyClass)s.Deserialize(xd.CreateReader()); 
} 
+0

और फ्रिज को आप कैसे करना चाहते हैं जब अतिरिक्त प्रकार (ज्ञात प्रकार) संकलन समय पर ज्ञात नहीं हैं? यह बुरा है, हमारे पास deserialize शुरू करने से पहले चीजों में एक प्री-कॉलबैक भी नहीं है? –

6

स्थिर लोड विधि का उपयोग करने के लिए यह अधिक मानक है।

public class MyClass 
{ 
    public static MyClass Load(XDocument xDoc) 
    { 
     XmlSerializer _s = new XmlSerializer(typeof(MyClass)); 
     return (MyClass)_s.Deserialize(xDoc.CreateReader()); 
    } 
} 
3

बेहतर उदाहरण के कारखाने के कुछ प्रकार, .:

public static MyClass Create(XDocument xd) 
{ 
    XmlSerializer _s = new XmlSerializer(typeof(MyClass)); 
    return (MyClass)_s.Deserialize(xd.CreateReader()); 
} 
-1

आपके सवाल का सरल जवाब नहीं है का उपयोग करें, आप नहीं कर सकते है। इसलिए कारण यह है कि जब आप deserialize करते हैं तो आप एक वस्तु बनाते हैं।

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

एक उदाहरण (जब यह रिक्त है कि नहीं है) (मेरे सिर से बाहर है, इसलिए एक मामूली मौका यह पूरी तरह से सही नहीं है):

public class MyClass 
{ 
    private XmlSerializer _s = new XmlSerializer(typeof(MyClass)); 
    private static MyClass mInstance = null; 

    public MyClass() { /* initialization logic */ } 
    public MyClass(XDocument xd) 
    { 
     mInstance = (MyClass)_s.Deserialize(xd.CreateReader()); 
    } 

    public void DoSomething() 
    { 
    if (mInstance != null) 
     mInstance.DoSomething(); 
    else 
    { 
     // logic for DoSomething 
    } 

    } 
} 

मुझे उम्मीद है कि यह थोड़ा स्पष्ट हो जाएगा, लेकिन मुझे इस तरह के डिज़ाइन का शौक नहीं है। मुझे लगता है कि यह सब अत्यधिक जटिल और त्रुटि संवेदनशील बनाता है।

+0

आपको एहसास है कि प्रत्येक MyClass जिसे आप पहले अतीत में तत्काल करते हैं, स्थिर स्थिरता के पिछले इंस्टॉलेशन को प्रतिस्थापित करेगा? फिर सभी तत्काल MyClass ऑब्जेक्ट्स उसी ऑब्जेक्ट का उपयोग स्मृति में करेंगे। – SamuelWarren

1

मैं एक ही बात करना चाहता था और निम्न कार्य करने का निर्णय लिया:

public class MyClass 
{ 
    public MyClass(){ 
    } 

    public MyClass(XDocument xd) 
    { 
     var t = typeof(MyClass); 
     var o = (MyClass)new XmlSerializer(t).Deserialize(xd.CreateReader()); 

     foreach (var property in t.GetProperties()) 
      property.SetValue(this, property.GetValue(o)); 
    } 
} 
संबंधित मुद्दे