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

时间:2014-12-11 14:21:24

标签: c# .net xml xml-serialization

我将提出一项技术建议,将大量对象序列化为XML。我们目前有一个NHibernate数据库

这不是重点,但是因为我已经知道这将是你的第一个问题:

为什么选择XML

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

现在,我正在考虑将这些数据序列化的最佳方法。

我知道XmlSerializer类,但是根据我的理解,它通过反射,获取所有属性,检查方法/属性上是否有任何装饰器,并且我关心有表现问题。

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

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

1 个答案:

答案 0 :(得分:0)

我今天早上没有时间作为更好的例子,但请考虑以下简单案例:

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>