Как перестроить класс C # из XML - PullRequest
0 голосов
/ 09 июня 2010

Я хотел бы сохранить экземпляр класса ac # .NET в SQL для последующего извлечения.Я могу использовать LINQ to SQL, чтобы добавить запись со всеми xml, составляющими класс.

Теперь, как мне извлечь этот xml и восстановить экземпляр объекта класса?

Ответы [ 4 ]

6 голосов
/ 09 июня 2010

Сериализация вашего объекта в строку 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();
            }
        }
    }

Десериализация строки XML в объект:

    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);
            }
        }
    }
2 голосов
/ 09 июня 2010

Как уже упоминалось, сериализация поможет, но помните о форматерах / сериализаторах, в противном случае это:

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

будет частью вашей сериализации.Когда это возможно, используйте DataContractSerializer.

Я настоятельно рекомендую вам увидеть это: .NET XML-сериализация безтекстовое объявление , прежде чем что-либо делать.

HTH

0 голосов
/ 09 июня 2010

Возможно, вы захотите использовать XStream для сохранения объекта в формате XML. Это довольно легко использовать.

0 голосов
/ 09 июня 2010

Я бы порекомендовал сериализацию и десериализацию xml.

Если у меня есть класс Person, определенный с помощью:

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

сохранение / загрузка из XML так же просто, как:

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();

Предупреждение: при этом сохраняются только открытые свойства / поля класса в виде XML-элементов. Если вы хотите осуществлять дополнительный контроль над сгенерированным XML, взгляните на атрибуты в пространстве имен System.Xml.Serialization (XmlAttributeAttribute - мой личный фаворит),

...