0

背景

我正在开发一个可以创建/打开项目的桌面应用程序(想想 Visual Studio)。我需要将这样的项目对象保存到 XML 文件(想想 .csproj)并从 XML 文件加载该项目对象。

目标

  1. 将 MyProject 类存储/加载到/从 XML 文件
  2. 人类可读的 XML(手动编辑不好,但它可以简化一些任务)
  3. 可以从其他语言/应用程序解析的有效 XML:
    • 文件以 XML 声明开头,<?xml version="1.1" encoding="utf-8"?>因为任何文化中的用户定义字符串都可能在这里结束,因此编码很重要。另请参阅有效的 XML 文件是否需要 xml 声明?
    • 可以指定类名称空间(例如 via DataContractAttribute.NameSpace

问:将对象持久化为可读且有效的 XML 文件的最佳方式是什么?

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

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

使用XmlTextWriter是一个死胡同,它不接受XmlWriterSettings. 编写 XML 的方法太多(错误/错误)。使用XmlWriter.Create(..)所需的设置确实会产生人类可读的 XML,包括声明。创建的实例是一些内部类,例如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);
        }
    }
4

1 回答 1

1

您可以传递一个XmlWriterSettings实例以XmlWriter.Create更精细地控制序列化。我相信XmlWriterSettings.OmitXmlDeclaration这是你需要的。

MSDN 上有一个关于 XML 输出格式的小概述。

于 2015-07-23T09:01:22.267 回答