2011-10-27 12 views
11

He estado trabajando con XML en la base de datos LINQ y encuentro que es muy difícil trabajar con el serializador.XMLSerializer para XElement

La base de datos LINQ requería un campo que almacena XElement.

Tengo un objeto complejo con muchas clase de estructura personalizada, por lo que me gustaría utilizar el XmlSerializer para serializar el objeto.

Sin embargo, el serializador solo se puede serializar en un archivo ("C: \ xxx \ xxx.xml") o en una secuencia de memoria.

Sin embargo, ¿convertirlo o serializarlo como un elemento XElement para poder almacenarlo en la base de datos utilizando LINQ?

Y cómo hacer el reverso? es decir, un Deserialize XElement ...

+0

¡Recuerde marcar la respuesta! – bnieland

Respuesta

13

intenta utilizar este

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

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

deserializar:

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

Muchas gracias !!!!!! – user883434

+0

Pero, ¿cómo hacer el reverso? – user883434

+0

Ver mi respuesta actualizada – Stecya

0

El SQL tiene tipo de datos XML puede ser que esto puede ayudar nos fijamos en msdn

+0

¿Cómo ayudará eso con la serialización o XElement? –

4

Antes que nada, vea Serialize Method para ver que el serializador puede manejar mucho más que simples flujos de memoria o archivos.

En segundo lugar, intente utilizar XElement.CreateWriter y luego pase el XmlWriter resultante al serializador.

+0

XElement.CreateWriter no parece estar disponible – user1234883

+0

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

+0

Sí, tienes razón. Debo estar mirando la clase equivocada. Lo siento – user1234883

6

Para hacer lo que John Saunders estaba describiendo más explícito, deserialización es muy sencillo:

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

serialización es un poco más desordenado, porque llamando desde un CreateWriter() XElement o XDocument crea elementos secundarios. (Además, el XmlWriter creado a partir de un XElement tiene ConformanceLevel.Fragment, lo que hace que XmlSerialize falle a menos que use la solución here). Como resultado, uso un XDocument, ya que esto requiere un único elemento y nos acerca al XmlWriter problema:

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