2011-10-27 15 views
11

मैं डेटाबेस LINQ में XML के साथ काम कर रहा हूं और पाते हैं कि धारावाहिक के साथ काम करना बहुत मुश्किल है।XMLSerializer XElement

डेटाबेस LINQ को एक फ़ील्ड की आवश्यकता होती है जो XElement स्टोर करती है।

मेरे पास कई अनुकूलित संरचना वर्ग के साथ एक जटिल वस्तु है, इसलिए मैं ऑब्जेक्ट को क्रमबद्ध करने के लिए XmlSerializer का उपयोग करना चाहता हूं।

हालांकि, धारावाहिक केवल फ़ाइल ("सी: \ xxx \ xxx.xml") या मेमोरी स्ट्रीम को क्रमबद्ध कर सकता है।

हालांकि इसे XElement के रूप में परिवर्तित या क्रमबद्ध करने के लिए ताकि मैं LINQ का उपयोग कर डेटाबेस में स्टोर कर सकूं?

और रिवर्स कैसे करें? यानी deserialize एक XElement ...

+0

उत्तर को चिह्नित करना याद रखें! – bnieland

उत्तर

13

कोशिश देखो इस

using (var stream = new MemoryStream()) 
{ 
    serializer.Serialize(stream, value); 
    stream.Position = 0; 

    using (XmlReader reader = XmlReader.Create(stream)) 
    { 
     XElement element = XElement.Load(reader); 
    } 
} 

deserialize उपयोग करने के लिए मदद कर सकते हैं हो सकती है:

XmlSerializer xs = new XmlSerializer(typeof(XElement)); 
using (MemoryStream ms = new MemoryStream()) 
{ 
    xs.Serialize(ms, xml); 
    ms.Position = 0; 

    xs = new XmlSerializer(typeof(YourType)); 
    object obj = xs.Deserialize(ms); 
} 
+1

आपको बहुत बहुत धन्यवाद !!!!!! – user883434

+0

लेकिन रिवर्स कैसे करें? – user883434

+0

मेरा अद्यतन उत्तर देखें – Stecya

0

एसक्यूएल XML डेटा प्रकार यह आप पर msdn

+0

सीरियलाइजेशन या एक्सलेमेंट के साथ यह कैसे मदद करेगा? –

4

सबसे पहले, यह देखने के लिए Serialize Method देखें कि धारावाहिक केवल स्मृति स्ट्रीम या फ़ाइलों की तुलना में बहुत अधिक संभाल सकता है।

दूसरा, XElement.CreateWriter का उपयोग करने का प्रयास करें और फिर परिणामस्वरूप XmlWriter को serializer पर पास कर दें।

+0

XElement.CreateWriter – user1234883

+0

उपलब्ध नहीं प्रतीत होता है http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.createwriter.aspx देखें। –

+0

हाँ, आप सही हैं। मुझे गलत वर्ग को देखना होगा। माफ़ कीजिये – user1234883

6

क्या जॉन सॉन्डर्स अधिक स्पष्ट का वर्णन किया गया था बनाने के लिए, अक्रमांकन बहुत सीधा है:

public static object DeserializeFromXElement(XElement element, Type t) 
{ 
    using (XmlReader reader = element.CreateReader()) 
    { 
     XmlSerializer serializer = new XmlSerializer(t); 
     return serializer.Deserialize(reader); 
    } 
} 

क्रमबद्धता एक छोटे से मेसियर है एक XElement से CreateWriter() बुला या XDocument बच्चे तत्वों, क्योंकि। (इसके अलावा, XElement से बनाए गए XmlWriter में ConformanceLevel.Fragment है, जो XmlSerialize को विफल होने का कारण बनता है जब तक कि आप वर्कअराउंड here का उपयोग नहीं करते हैं।) परिणामस्वरूप, मैं एक एक्सडॉक्यूमेंट का उपयोग करता हूं, क्योंकि इसके लिए एक तत्व की आवश्यकता होती है, और हमें XmlWriter के आसपास मिलती है मुद्दा:

public static XElement SerializeToXElement(object o) 
{ 
    var doc = new XDocument(); 
    using (XmlWriter writer = doc.CreateWriter()) 
    { 
     XmlSerializer serializer = new XmlSerializer(o.GetType()); 
     serializer.Serialize(writer, o); 
    } 

    return doc.Root; 
}