2011-11-21 7 views
5

मैं उन वस्तुओं को क्रमबद्ध/deserialize करने की कोशिश कर रहा हूं जिनके कारखाने से बने सदस्य हैं। उदाहरण के लिए, मान लें कि Foo प्रकार का सदस्य है, जिसे FooFactory.CreateFoo (int bar) का उपयोग करके तत्काल किया जाता है।एक्सएमएलएसरियलाइज़र और फैक्ट्री-निर्मित तत्व

मेरे वर्तमान विचार

1. बनाएँ एक कस्टम XmlReader (उदाहरण के लिए, XmlTextReader से निकाले जाते हैं) करने के लिए है, और यह करने के लिए कारखाना देते

2.implement IXmlSerializable

3.in ReadXml(), मैं पाठक को कारखाने से पकड़ सकता हूं।

यह सुनिश्चित नहीं है कि यह करने का सबसे शानदार तरीका है, क्या किसी ने भी इसी तरह के प्रयास किए हैं?

उत्तर

5

XmlSerializer बस इसके लिए सेट नहीं किया गया है। मैं दृढ़ता से सुझाव दूंगा कि यदि आप XmlSerializer का उपयोग करना चाहते हैं, तो आपकी सबसे अच्छी शर्त आपके डेटा को एक सरल डीटीओ मॉडल पहले पर मैप करना होगा, और को क्रमबद्ध करें। डीटीओ से अपने मॉडल में वापस कोड लिखते समय, नियमित कोड में फैक्टरी निर्माण जोड़ें। डीटीओ मॉडल सरल होना चाहिए; इसके साथ खुश होने के लिए XmlSerializer के लिए काफी आसान है।

हाँ, IXmlSerializable को लागू करने एक विकल्प है, हालांकि: कि एपीआई बहुत कठिन 100% सही (सभी विभिन्न तरीकों से एक्सएमएल यह करने के लिए प्रकट हो सकते हैं संभाल करने के लिए) प्राप्त करने के लिए है। मुझे लगता है कि एपीआई बहुत कठिन है, और मैं बहुत सी धारावाहिकता करता हूं। मैं नम्रतापूर्वक सबमिट करता हूं कि आपके मुख्य मॉडल से डीटीओ मॉडल में मॉडल को मानचित्र करने के लिए कोड की कुछ पंक्तियां लिखना IXmlSerializable को लागू करने की कोशिश करने से बहुत अधिक मजबूत (और बहुत तेज़) है।

उदाहरण के लिए, आप हो सकता है:

[XmlRoot("foo")] 
public class FooDTO { 
    [XmlAttribute("bar")] 
    public int Bar {get;set;} 

    public static implicit operator Foo(FooDTO value) 
    { 
     return value == null ? null : FooFactory.Create(value.Bar); 
    } 
    public static implicit operator FooDTO(Foo value) 
    { 
     return value == null ? null : new FooDTO { Bar = value.Bar; } 
    } 
} 

तो आप बस से FooDTO को Foo से परिवर्तित कर सकते हैं:

Foo foo = ... 
FooDTO dto = foo; 
+0

धन्यवाद, डीटीओ यहां जाने का रास्ता हो रहा है! :) – Oyvind

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