2010-07-28 18 views
23

कभी-कभी मैं डेटाबेस में एक राउंड ट्रिप स्थापित किए बिना अपने कक्षाओं के संग्रहीत डेटा का अनुकरण करना चाहता हूं। उदाहरण के लिए, मान लीजिए कि मैं निम्नलिखित श्रेणियां होती हैं करते हैं:एक्सएमएल में सरल वर्गों को क्रमबद्ध/deserialize कैसे करें और

public class ShoppingCart 
{ 
    public List<CartItem> Items {get; set;} 
    public int UserID { get; set; } 
} 

public class CartItem 
{ 
    public int SkuID { get; set; } 
    public int Quantity { get; set; } 
    public double ExtendedCost { get; set; } 
} 

मान लीजिए कि मैं स्मृति में एक ShoppingCart वस्तु का निर्माण और एक XML दस्तावेज के रूप में यह "बचाने" करना चाहते हैं। क्या यह किसी प्रकार के XDocument.CreateFromPOCO(shoppingCart) विधि के माध्यम से संभव है? दूसरी दिशा में कैसे: जैसे XML दस्तावेज़ से ShoppingCart ऑब्जेक्ट बनाने का एक अंतर्निहित तरीका है?

उत्तर

47

XmlSerializer ऐसा करने का एक तरीका है। DataContractSerializer एक और है। XmlSerializer साथ उदाहरण:

using System.Xml; 
using System.Xml.Serialization; 

//... 

ShoppingCart shoppingCart = FetchShoppingCartFromSomewhere(); 
var serializer = new XmlSerializer(shoppingCart.GetType()); 
using (var writer = XmlWriter.Create("shoppingcart.xml")) 
{ 
    serializer.Serialize(writer, shoppingCart); 
} 

और इसे वापस deserialize करने के लिए:

var serializer = new XmlSerializer(typeof(ShoppingCart)); 
using (var reader = XmlReader.Create("shoppingcart.xml")) 
{ 
    var shoppingCart = (ShoppingCart)serializer.Deserialize(reader); 
} 

इसके अलावा बेहतर कैप्सूलीकरण के लिए मैं आप अपने CartItem कक्षा में खेतों के बजाय गुण का उपयोग कर की सिफारिश करेंगे।

+0

सुझाव के लिए धन्यवाद। मैं खेतों के बजाय गुणों का उपयोग करना था। फिक्स्ड। –

+0

यह परीक्षण करने के लिए मुझे कुछ समय लगा, लेकिन यह पूरी तरह से काम किया। धन्यवाद! –

+3

मेरी इच्छा है कि मैं आपको पिछले कुछ हफ्तों में इस उत्तर में नेविगेट करने के लिए हर बार एक अपवर्तित दे सकता हूं। यह लाभांश का भुगतान करता रहता है! –

2

आप या DataContractSerializer के साथ क्रमबद्ध/deserialize कर सकते हैं।

DataContract और DataMember गुणों के साथ अपने वर्गों को एनोटेट करें और फ़ाइल में xml को क्रमबद्ध करने के लिए ऐसा कुछ लिखें।

ShoppingCart cart = ... 
using(FileStream writer = new FileStream(fileName, FileMode.Create)) 
{ 
    DataContractSerializer ser = new DataContractSerializer(typeof(ShoppingCart)); 
    ser.WriteObject(writer, cart); 
} 
+0

सीरियलाइजेशन के दौरान अपवाद फेंक दिया गया है तो क्या होगा? –

+1

@ डारिन: DataContractSerializer का उपयोग शुरू करते समय आप अक्सर सामना करेंगे। लेकिन यह आमतौर पर आपके वर्गों की एनोटेशन विशेषता के लिए उबाल जाता है। XmlSerializer का उपयोग करना आसान है क्योंकि इसमें जो कुछ भी आप फेंकते हैं, लेकिन डेटाकंट्रैक्टसेरियलाइज़र तेज़ होता है, लेकिन इसे पाने और चलाने के लिए और अधिक "काम" की आवश्यकता होती है। –

+0

@ माइकल, मुझे लगता है कि आपको मेरा अंक नहीं मिला। मेरा मतलब यह था कि यदि कोई अपवाद फेंक दिया जाता है तो आप एक फ़ाइल हैंडल को रिसाव करेंगे जो बहुत खराब है क्योंकि यह फ़ाइल को लॉक करेगा और जब तक आप एप्लिकेशन को मार नहीं लेते तब तक कोई अन्य प्रक्रिया इसके साथ कुछ भी करने में सक्षम नहीं होगी। –

0

बस को चिह्नित क्या आप [XmlElement (नाम)] (या XmlAttribute, XmlRoot, आदि) के साथ क्रमानुसार और फिर XmlSerializer उपयोग करना चाहते हैं। यदि आपको वास्तव में कस्टम फॉर्मेटिंग की आवश्यकता है, तो IXmlSerializable लागू करें।

+2

थ्रेड पर अन्य उत्तरों की तरह कोड नमूना क्यों प्रदान नहीं करते? – Konstantin

7

अच्छी तरह से किया गया। स्ट्रिंग करने के लिए सादे पॉको को क्रमबद्ध करने का उदाहरण यहां दिया गया है।

private string poco2Xml(object obj) 
    { 
     XmlSerializer serializer = new XmlSerializer(obj.GetType()); 
     StringBuilder result = new StringBuilder(); 
     using (var writer = XmlWriter.Create(result)) 
     { 
      serializer.Serialize(writer, obj); 
     } 
     return result.ToString(); 
    } 
संबंधित मुद्दे