Как мне десериализовать некоторый класс из XML (файла) и наоборот?

У меня есть следующие члены класса и данных (плюс нерелевантные методы). Я новичок в XML и .NET (хотя это оправдание устаревает) и провел пару дней, читая записи MSDN (и все, что нашел Google) для первого XMLReader , затем XMLDocument и теперь XDocument, XElement и XNode, но я не ближе к конкретному решению для сериализации моего класса (возможно, мне нужно более подробно изучить сериализацию в .NET). Для начала у меня есть некоторые данные в файле XML, которые я хочу прочитать (хотя они, вероятно, в неправильном формате), чтобы инициализировать класс для инициализации моего приложения. Класс конфигурации выглядит следующим образом:

class IWantToFile
{
    class DirsAndFiles
    {
        public List<string> Suffixes;
        public string Dir;
    }
    enum OPOptsEnum
    {
        op1Description, op2Description, op3Description, op4Description,
        op5Description, op6Description, op7Description, op8Description,
    };
    List<DirsAndFiles> ProjectDirs;
    bool[] OPOpts = new bool[(int)OPOptsEnum.op8Description + 1];
    bool otherOpt;
}

Наблюдая за отношениями один к одному и один ко многим (например, List<DirsAndFiles> ProjectDirs), может ли кто-нибудь дать краткие методы чтения и записи этих данных в файл? Это очень помогло бы моему развитию в этих областях.

У меня есть:

        if (File.Exists(SPECFILENAME)) {
            XDocument xdoc = XDocument.Load(SPECFILENAME);
            //Ummm.....
        }

но тогда мое отсутствие опыта работы с .NET XML и Linq подводит меня.


person John    schedule 14.09.2011    source источник


Ответы (2)


Я думаю, вы можете использовать XmlSerializer , который «Сериализует и десериализует объекты в документы XML и из них»?

Пример кода см. в разделе Как сериализовать объект в XML с помощью Visual C#.

person stuartd    schedule 14.09.2011
comment
Я уверен, что пытался прочитать это руководство Microsoft ранее, и оно было в VB, может быть, это было так, support.microsoft.com/kb/316730/en-us. Я бы просто установил MDE моего SDK на XMLserializer, но сколько кода?! Так что мне нужно использовать это перед изучением XDocument, XElement и XName? Возможно, начав с сериализации моих данных, я смогу написать код десериализации... - person John; 14.09.2011
comment
будет ли написание XML-схемы и использование xsd.exe генерировать для меня сериализуемый класс? - person John; 14.09.2011

[Serializable]
public class MyObject
{
    public string SerializeMe { get; set; }

    [XmlIgnore]
    public string DONTSerializeMe { get; set; }
}

Помощник....

public static class SerializerHelper<T>
{
    public static string Serialize(T myobject)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        StringWriter stringWriter = new StringWriter();
        xmlSerializer.Serialize(stringWriter, myobject);
        string xml = stringWriter.ToString();

        return xml;
    }
    public static T Deserialize(string xml)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        StringReader stringReader = new StringReader(xml);
        return (T)xmlSerializer.Deserialize(stringReader);
    }
}

использование

MyObject myObject = new MyObject();
string xml = SerializerHelper<MyObject>.Serialize(myObject);
MyObject DeserializedObject = SerializerHelper<MyObject>.Deserialize(xml);
person Valamas    schedule 14.09.2011
comment
Вы создаете объект типа MyObject, но затем сериализуете его как тип MyClass! Я не думаю, что это сработает. Опечатка? - person Chris Dunaway; 14.09.2011
comment
спасибо, да. О пороки не копировать и не вставлять! Кто бы это сказал, лол. - person Valamas; 15.09.2011
comment
ржу не могу. Да, копирование вставки может принести свои беды, если вы не будете осторожны! - person Chris Dunaway; 15.09.2011