如何使用XML声明将对象持久化为人类可读的XML文件
本文关键字:XML 人类 文件 持久化 何使用 声明 对象 | 更新日期: 2023-09-27 18:04:06
背景
我正在开发一个桌面应用程序,可以创建/打开项目(想想visualstudio(。我需要将这样一个项目对象持久化到一个XML文件中(想想.csproj(,并从XML文件中加载该项目对象。
目标
- 将类MyProject存储到XML文件/从XML文件加载类MyProject
- 人类可读的XML(手动编辑很糟糕,但它可以简化一些任务(
- 可以从其他语言/应用程序解析的有效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);
}
}
您可以将XmlWriterSettings
实例传递给XmlWriter.Create
,以便更精细地控制序列化。我相信XmlWriterSettings.OmitXmlDeclaration
正是你所需要的。
MSDN上有一个关于XML输出格式的小概述。