背景
我正在开发一个可以创建/打开项目的桌面应用程序(想想 Visual Studio)。我需要将这样的项目对象保存到 XML 文件(想想 .csproj)并从 XML 文件加载该项目对象。
目标
- 将 MyProject 类存储/加载到/从 XML 文件
- 人类可读的 XML(手动编辑不好,但它可以简化一些任务)
- 可以从其他语言/应用程序解析的有效 XML:
- 文件以 XML 声明开头,
<?xml version="1.1" encoding="utf-8"?>
因为任何文化中的用户定义字符串都可能在这里结束,因此编码很重要。另请参阅有效的 XML 文件是否需要 xml 声明? - 可以指定类名称空间(例如 via
DataContractAttribute.NameSpace
)
- 文件以 XML 声明开头,
问:将对象持久化为可读且有效的 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);
}
}