如何使用XML声明将对象持久化为人类可读的XML文件

本文关键字:XML 人类 文件 持久化 何使用 声明 对象 | 更新日期: 2023-09-27 18:04:06

背景

我正在开发一个桌面应用程序,可以创建/打开项目(想想visualstudio(。我需要将这样一个项目对象持久化到一个XML文件中(想想.csproj(,并从XML文件中加载该项目对象。

目标

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

如何使用XML声明将对象持久化为人类可读的XML文件

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

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