【问题标题】:How would I deserialize some class from XML (file), and vice versa?我将如何反序列化 XML(文件)中的某些类,反之亦然?
【发布时间】:2011-11-16 23:10:39
【问题描述】:

我有以下类和数据成员(加上不相关的方法)首先是 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&lt;DirsAndFiles&gt; ProjectDirs),有人可以给出简洁的方法来读取和写入这些数据到文件吗?这将极大地帮助我在这些领域的发展。

我已经知道了:

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

但是我缺乏 .NET XML 和 Linq 经验让我失望了。

【问题讨论】:

    标签: c# xml-serialization linq-to-xml xelement xml-deserialization


    【解决方案1】:

    我认为您可能想要使用XmlSerializer,它“将对象序列化和反序列化到 XML 文档中和从 XML 文档中反序列化”?

    示例代码请参见How to serialize an object to XML by using Visual C#

    【讨论】:

    • 我确定我之前尝试阅读过微软的howto,它是在VB中,也许是这个,support.microsoft.com/kb/316730/en-us。我只是将我的 SDK 的 MDE 设置为 XMLserializer,但是有多少代码?!所以我需要在学习 XDocument、XElement 和 XName 之前使用它吗?也许从序列化我的数据开始将有助于编写反序列化代码......
    • 是否会编写一个 XML Schema 并使用 xsd.exe 为我生成一个可序列化的类?
    【解决方案2】:
    [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);
    

    【讨论】:

    • 您正在创建一个 MyObject 类型的对象,但随后将其序列化为 MyClass 类型!我认为这行不通。错字?
    • 谢谢,是的。哦,不复制和粘贴的弊端!谁会这么说哈哈。
    • 哈哈。是的,如果你不小心,复制粘贴可能会带来坏处!
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多