XmlSerialization:有关性能和参考的问题

本文关键字:参考 问题 性能 XmlSerialization | 更新日期: 2023-09-27 18:34:02

我必须提出一个技术建议,将一大组对象序列化为XML。我们目前有一个包含NHibernate的数据库

这不是真正的重点,但既然我已经知道这将是你的第一个问题:

为什么选择使用XML。

    我们
  • 有一个非常特殊的需求:我们有很多数据,但我们有时只使用它们一次,在网络上配置很多硬件设备。这意味着当我们需要数据时,我们会读取整个数据库
  • 我们目前正在使用 NHibernate,我们的印象是,由于复杂的类结构,序列化/反序列化数据需要很多时间。
  • 我们有很多层次结构级别,进行联接需要花费大量时间
  • 我们经常需要更改结构,XSLT 将完全适合我们的升级需求
  • 我们希望避免第三方库(许可+分发问题(

所以现在,我正在考虑序列化这些数据的最佳方法是什么。

我知道XmlSerializer类,但就我所理解的而言,它通过反射、获取所有属性、检查方法/属性上是否有任何装饰器来工作,并且我担心存在性能问题。

我也担心引用:我们有一个根对象,一个叶子可以引用另一个叶子(比如:根节点 A,它拥有一个 B 和 C 对象,以及 C 引用 B(非常虚拟的例子,在我们的例子中,我们有很多级别/抽象之间(。

  1. 我对XmlSerializer的反射用法是否正确?有没有办法避免反射(除了实现IXmlSerializable
  2. 如何处理两次引用的对象(如果只序列化一个引用,有没有办法恢复另一个引用?

XmlSerialization:有关性能和参考的问题

今天早上我没有时间做一个更好的例子,但请考虑以下简单情况:

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>