XmlSerialization:有关性能和参考的问题
本文关键字:参考 问题 性能 XmlSerialization | 更新日期: 2023-09-27 18:34:02
我必须提出一个技术建议,将一大组对象序列化为XML。我们目前有一个包含NHibernate的数据库
这不是真正的重点,但既然我已经知道这将是你的第一个问题:
为什么选择使用XML。
- 我们
- 有一个非常特殊的需求:我们有很多数据,但我们有时只使用它们一次,在网络上配置很多硬件设备。这意味着当我们需要数据时,我们会读取整个数据库
- 我们目前正在使用 NHibernate,我们的印象是,由于复杂的类结构,序列化/反序列化数据需要很多时间。
- 我们有很多层次结构级别,进行联接需要花费大量时间
- 我们经常需要更改结构,XSLT 将完全适合我们的升级需求
- 我们希望避免第三方库(许可+分发问题(
所以现在,我正在考虑序列化这些数据的最佳方法是什么。
我知道XmlSerializer
类,但就我所理解的而言,它通过反射、获取所有属性、检查方法/属性上是否有任何装饰器来工作,并且我担心存在性能问题。
我也担心引用:我们有一个根对象,一个叶子可以引用另一个叶子(比如:根节点 A,它拥有一个 B 和 C 对象,以及 C 引用 B(非常虚拟的例子,在我们的例子中,我们有很多级别/抽象之间(。
- 我对
XmlSerializer
的反射用法是否正确?有没有办法避免反射(除了实现IXmlSerializable
? - 如何处理两次引用的对象(如果只序列化一个引用,有没有办法恢复另一个引用?
今天早上我没有时间做一个更好的例子,但请考虑以下简单情况:
public class Inner {
public int IX {get;set;}
public string IY {get;set;}
}
public class Outer {
public int OX {get;set;}
public IEnumerable<Inner> OI {get;set;}
}
public XDocument SerializeOuter(Outer obj)
{
return new XDocument(
new XElement("Outer",
new XAttribute("OX", obj.OX.ToString()),
new XElement("Inners", from i in obj.OI
select SerializeInner(i))));
}
private XElement SerializeInner(Inner obj)
{
return new XElement("Inner",
new XAttribute("IX", obj.IX),
new XElement("IY", obj.IY));
}
使用示例:
public static void Demo()
{
var outer = new Outer {
OX = 1,
OI = new[] {new Inner {IX = 2, IY = "two"}, new Inner {IX = 3, IY = "three"}}
};
var doc = SerializeOuter(outer);
Console.WriteLine(doc.ToString());
}
这会产生:
<Outer OX="1">
<Inners>
<Inner IX="2">
<IY>two</IY>
</Inner>
<Inner IX="3">
<IY>three</IY>
</Inner>
</Inners>
</Outer>