2011-10-27 13 views
11

XML ile LINQ veritabanında çalışıyorum ve seri hale getirici ile çalışmak çok zor.XMLSerializer - XElement

Veritabanı LINQ, XElement depolayan bir alan gerektiriyordu.

Birçok özelleştirilmiş yapı sınıfıyla karmaşık bir nesnem var, bu yüzden nesneyi serileştirmek için XmlSerializer'ı kullanmak istiyorum. Ancak, seri hale getirici yalnızca dosyaya ("C: \ xxx \ xxx.xml") veya bir bellek akışına serileştirebilir.

Ancak LINQ kullanarak veritabanında saklamak için bir XElement dönüştürmek veya serileştirmek için?

Ve tersi nasıl yapılır? yani Deserialize bir XElement ...

+0

Cevabı işaretlemeyi unutmayın! – bnieland

cevap

13

deneyin bakmak yardımcı olabilir olabilir XML veri türü vardır:

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

Çok teşekkür ederim !!!!!! – user883434

+0

Ama tersi nasıl yapılır? – user883434

+0

Güncellenen yanıtıma bakın – Stecya

0

SQL bunun bu

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

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

deserialize kullanmak msdn

+0

Bu, serileştirme veya XElement ile nasıl yardımcı olur? –

4

Her şeyden önce, serileştiricinin bellek akışından veya dosyalarından çok daha fazlasını işleyebildiğini görmek için Serialize Method'a bakın.

İkinci olarak, XElement.CreateWriter kullanmayı deneyin ve sonuçta elde edilen XmlWriter'i seri hale getiriciye geçirin. John Saunders daha açık anlatan ne yapmak

+0

XElement.CreateWriter kullanılabilir görünmüyor – user1234883

+0

Bkz. Http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.createwriter.aspx. –

+0

Evet, haklısınız. Yanlış sınıfa bakmalıyım. Afedersiniz – user1234883

6

, seri kaldırma çok basittir:

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

Serile biraz daha karışık olan bir XElement gelen CreateWriter() arayarak veya XDocument alt öğeleri oluşturduğundan. (Ayrıca, bir XElement öğesinden oluşturulan XmlWriter, here geçici çözümünü kullanmazsanız, XmlSerialize'nin başarısız olmasına neden olan ConformanceLevel.Fragment'e sahiptir.) Sonuç olarak, bir XDocument kullanıyorum, çünkü bu tek bir öğe gerektirir ve XmlWriter'in etrafından dolanır sorun:

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; 
}