使用 xml 序列化程序保存对象状态。从 属性 或硬编码字符串中获取节点名称的推荐方法?
Saving object state using xml Serializer. Recommend approach for getting node name from property or hardcoded string?
我们正在尝试使用 XML 序列化程序保存对象的状态。对于讨论,假设对象是这样的:
Class Program
{
public string Char1 {get; set;}
public XMLNode Serialize (XmlDocument doc)
{
var node = document.CreateElement("Mod")
node.SetAttribute("Char1", Char1.ToString());
}
}
这里我们获取 属性 Char1 的值并尝试将其写入名称为 Char1 的节点。
使用反射从 Char1 属性 派生节点名称 "Char1" 是否更好。但这可能会导致在 属性 名称更改时经常更改 XML 文档。
如果更改 属性 名称但未更新字符串,则 xml 文档中的值将与该字段的上下文不匹配。
哪种方法更可取?
请提出在写入 xml 文件时是否有任何其他更好的方法来避免魔术字符串。
我更喜欢以下方式:创建一个 class 来保存您想要序列化的所有数据。然后像这样创建一个 XmlSerializer 的实例
xmlDocument = new XmlDocument();
using (var stringWriter = new StringWriter(CultureInfo.InvariantCulture))
{
using (var xmlTextWriter = new XmlTextWriter(stringWriter))
{
xmlTextWriter.Formatting = Formatting.Intented;
var xmlSerializer = new XmlSerializer(myObject.GetType());
xmlSerializer.Serialize(xmlTextWriter, myObject);
xmlDocument.PreserveWhitespace = true;
xmlDocument.LoadXml(stringWriter.ToString());
}
}
我们正在尝试使用 XML 序列化程序保存对象的状态。对于讨论,假设对象是这样的:
Class Program
{
public string Char1 {get; set;}
public XMLNode Serialize (XmlDocument doc)
{
var node = document.CreateElement("Mod")
node.SetAttribute("Char1", Char1.ToString());
}
}
这里我们获取 属性 Char1 的值并尝试将其写入名称为 Char1 的节点。
使用反射从 Char1 属性 派生节点名称 "Char1" 是否更好。但这可能会导致在 属性 名称更改时经常更改 XML 文档。
如果更改 属性 名称但未更新字符串,则 xml 文档中的值将与该字段的上下文不匹配。
哪种方法更可取?
请提出在写入 xml 文件时是否有任何其他更好的方法来避免魔术字符串。
我更喜欢以下方式:创建一个 class 来保存您想要序列化的所有数据。然后像这样创建一个 XmlSerializer 的实例
xmlDocument = new XmlDocument();
using (var stringWriter = new StringWriter(CultureInfo.InvariantCulture))
{
using (var xmlTextWriter = new XmlTextWriter(stringWriter))
{
xmlTextWriter.Formatting = Formatting.Intented;
var xmlSerializer = new XmlSerializer(myObject.GetType());
xmlSerializer.Serialize(xmlTextWriter, myObject);
xmlDocument.PreserveWhitespace = true;
xmlDocument.LoadXml(stringWriter.ToString());
}
}