Pregunta

Me gustaría guardar una instancia de una clase C # .NET en SQL para su posterior recuperación. Soy capaz de utilizar LINQ to SQL para añadir un registro completo con todo el XML que conforma la clase.

Ahora, ¿cómo puedo recuperar y reconstruir xml que la instancia del objeto de clase?

¿Fue útil?

Solución

serializar objeto a una cadena XML:

    public static string ToXml<T>(T obj)
    {
        XmlWriterSettings settings = new XmlWriterSettings();

        settings.OmitXmlDeclaration = true;
        using (Stream stream = new MemoryStream())
        using (XmlWriter writer = XmlWriter.Create(stream, settings))
        {
            new XmlSerializer(obj.GetType()).Serialize(writer, obj);
            writer.Flush();
            stream.Flush();
            stream.Position = 0;
            using (TextReader reader = new StreamReader(stream))
            {
                return reader.ReadToEnd();
            }
        }
    }

deserializar una cadena XML en un objeto:

    public static T FromXml<T>(string xml)
    {
        using (TextReader reader = new StringReader(xml))
        {
            try
            {
                return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
            }
            catch (InvalidOperationException)
            {
                // string passed is not XML, return default
                return default(T);
            }
        }
    }

Otros consejos

Como otros mencionar, serialización va a hacer el truco, pero sea consciente de la formateadores / serializador, de lo contrario esto:

<?xml version="1.0" encoding="utf-8" ?>

será parte de su serialización. Siempre que sea posible, utilice el DataContractSerializer.

le recomiendo que vean esto: NET serialización XML sin texto de la declaración antes de hacer nada.

HTH

Es posible que desee utilizar xstream para almacenar el objeto como XML . Es bastante fácil de usar.

Yo recomendaría serialización XML y deserialización.

Si tengo una clase de persona definida con:

public class Person
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

guardándolo / cargarlo desde XML es tan simple como:

Person donald = new Person{
                ID=1, 
                FirstName="Donald", 
                LastName="Duck", 
                DateOfBirth=new DateTime(1950,1,1)};

//create a xml serializer with the required type
XmlSerializer xs=new XmlSerializer(typeof(Person));

//open a stream to the file, and save the instance
TextWriter tw = new StreamWriter(@"C:\donald.xml");
xs.Serialize(tw, donald);
tw.Close();

//open a reader stream to the file, and just load the instance.
TextReader tr = new StreamReader(@"C:\donald.xml");
Person donald2 = (Person) xs.Deserialize(tr);
tr.Close();

Advertencia: Esto ahorra solamente los públicos propiedades / campos de una clase, como elementos XML. Si desea controlar la adición de ejercicio sobre el XML generado, echar un vistazo a los atributos en el System.Xml.Serialization espacio de nombres (XmlAttributeAttribute es mi favorito personal),

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top