如何将对象持久化为具有 XML 声明的人类可读 XML 文件?

How to Persist Object as human readable XML File with XML Declaration?

背景

我正在开发一个桌面应用程序,它可以 create/open 一个 项目 (想想 visual studio)。我需要将这样的项目对象保存到 XML 文件(想想 .csproj)并从 XML 文件加载该项目对象。

目标

  1. 存储/加载class MyProject 到/从XML 文件
  2. 人类可读XML(手动编辑不好,但它可以简化一些任务)
  3. 可以从其他语言/应用程序解析的有效 XML:
    • 文件以 XML 声明开始,如 <?xml version="1.1" encoding="utf-8"?> 因为任何文化中用户定义的字符串都可能在这里结束,因此编码很重要。另见 Does a valid XML file require an xml declaration?
    • 可以指定
    • Class 个命名空间(例如通过 DataContractAttribute.NameSpace

问:将对象保存到可读且有效的 XML 文件中的最佳方法是什么?

创建 XML 的方法有很多种,对我来说 [DataContract] 属性似乎是可行的方法,因为它允许简单的序列化和反序列化返回对象(目标 1)。使用 XmlTextWriter 时,我还可以指定 Formatting.Indented,这解决了目标 2。但是,我无法创建 XML 声明。

编辑:基于已接受答案的解决方案

使用XmlTextWriter是死路一条,不接受XmlWriterSettings。 XML的写法太多了(wrong/bad)。使用具有所需设置的 XmlWriter.Create(..) 确实会产生人类可读的 XML 包括声明。创建的实例是一些内部 class,例如 WellFormedXmlWriter。代码:

    public static void Store<T>(string filename, T obj)
        where T : class
    {
        XmlWriterSettings settings = new XmlWriterSettings()
        {
            Indent = true, // human readable
            OmitXmlDeclaration = false, // don't omit the encoding
            Encoding = Encoding.UTF8
        };
        using (var xmlwriter = XmlWriter.Create(filename, settings))
        {
            DataContractSerializer ser = new DataContractSerializer(typeof(T));
            ser.WriteObject(xmlwriter, obj);
        }
    }

    public static T Load<T>(string filename)
        where T : class
    {
        using (var xmlReader = XmlReader.Create(filename))
        {
            DataContractSerializer ser = new DataContractSerializer(typeof(T));
            return (T)ser.ReadObject(xmlReader, true);
        }
    }

您可以将 XmlWriterSettings 实例传递给 XmlWriter.Create 以便更精细地控制序列化。我相信 XmlWriterSettings.OmitXmlDeclaration 是您所需要的。

There's a small overview of XML output formatting on MSDN.