如何将对象持久化为具有 XML 声明的人类可读 XML 文件?
How to Persist Object as human readable XML File with XML Declaration?
背景
我正在开发一个桌面应用程序,它可以 create/open 一个 项目 (想想 visual studio)。我需要将这样的项目对象保存到 XML 文件(想想 .csproj)并从 XML 文件加载该项目对象。
目标
- 存储/加载class MyProject 到/从XML 文件
- 人类可读XML(手动编辑不好,但它可以简化一些任务)
- 可以从其他语言/应用程序解析的有效 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
是您所需要的。
背景
我正在开发一个桌面应用程序,它可以 create/open 一个 项目 (想想 visual studio)。我需要将这样的项目对象保存到 XML 文件(想想 .csproj)并从 XML 文件加载该项目对象。
目标
- 存储/加载class MyProject 到/从XML 文件
- 人类可读XML(手动编辑不好,但它可以简化一些任务)
- 可以从其他语言/应用程序解析的有效 XML:
- 文件以 XML 声明开始,如
<?xml version="1.1" encoding="utf-8"?>
因为任何文化中用户定义的字符串都可能在这里结束,因此编码很重要。另见 Does a valid XML file require an xml declaration?
可以指定 - Class 个命名空间(例如通过
DataContractAttribute.NameSpace
)
- 文件以 XML 声明开始,如
问:将对象保存到可读且有效的 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
是您所需要的。