2011-10-27 20 views
11

Pracowałem z XML w bazie danych LINQ i odkryłem, że bardzo trudno jest pracować z serializerem.XMLSerializer do XElement

Baza danych LINQ wymagała pola przechowującego XElement.

Mam obiekt złożony z wieloma niestandardowymi klasami struktury, więc chciałbym użyć XmlSerializer do serializacji obiektu.

Jednak serializator może serializować tylko do pliku ("C: \ xxx \ xxx.xml") lub do strumienia pamięci.

Jednak przekonwertować lub serializować go jako XElement, tak że mogę przechowywać w bazie danych za pomocą LINQ?

I jak zrobić odwrotny? tj Cofnięcie Xelement ...

+0

Pamiętaj, aby zaznaczyć odpowiedź! – bnieland

Odpowiedz

13

Spróbuj skorzystać z tej

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

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

deserializowania:

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

Dziękuję bardzo !!!!!! – user883434

+0

Ale jak zrobić odwrotny? – user883434

+0

Zobacz moją zaktualizowaną odpowiedź – Stecya

0

SQL ma typ danych XML może być może to pomoże Ci spojrzeć na msdn

+0

W jaki sposób pomoże to w przypadku serializacji lub XElement? –

4

Przede wszystkim zobacz Serialize Method, aby zobaczyć, że serializator może obsłużyć dużo więcej niż tylko strumienie pamięci lub pliki.

Po drugie, spróbuj użyć XElement.CreateWriter, a następnie przekazanie wynikowego XmlWriter do serializera.

+0

XElement.CreateWriter nie wydaje się być dostępny – user1234883

+0

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

+0

Tak, masz rację. Muszę patrzeć na niewłaściwą klasę. Przepraszam – user1234883

6

aby to, co John Saunders opisywał bardziej wyraźne, deserializacji jest bardzo prosta:

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

serializacji jest trochę bałaganu, bo dzwoni CreateWriter() z Xelement lub XDocument tworzy elementy podrzędne. (Ponadto XmlWriter utworzony z XElement ma ConformanceLevel.Fragment, który powoduje, że XmlSerialize ulega awarii, chyba że używasz obejścia here.) W rezultacie używam XDocument, ponieważ wymaga to jednego elementu i przenosi nas do XmlWriter wydanie:

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