循环引用和自定义字段使用什么序列化程序(到 xml)?

What serializer to use (to xml) for circular reference and custom field?

我有以下 xml:

<A name="">
    <B name="">
        <C name="">
            <B name=""/>
            <B name=""/>
        </C>
    </B>
    <B name="">
        <C name="">
            <B name=""/>
            <B name=""/>
            <B name=""/>
            <B name=""/>
        </C>
    </B>
</A>

请注意,元素 C 会创建循环引用,因此我无法使用 XmlSerializer。

如何反序列化和序列化它? 看来我不能使用 DataContractSerializer 因为:

  1. DataContract 不支持属性("Name" 在我的示例中)
  2. DataContract 不支持忽略外部元素名称,例如

    List<B> BList;
    

将序列化为:

<C name="">
    <BList>
        <B name=""/>
        <B name=""/>
    </Blist>
</C>

但我也想保持第一个示例中的结构。

非常感谢。

如果您只关心序列化/反序列化,那么您应该使用支持循环的序列化程序,例如 Json.Net. If I am not mistaken binary serializer 也应该可以。

您可以借助 XML 序列化器和反序列化器

实现此目的

Class 结构:

[XmlRoot(ElementName = "A")]
    public class A
    {
        [XmlAttribute("Name")]
        public string Name { get; set; }
        private List<B> b = new List<B>();

        [XmlElement("B")]
        public List<B> B
        {
            get { return b; }
            set { b = value; }
        }
    }

    public class B
    {
        [XmlAttribute("Name")]
        public string Name { get; set; }
        private List<C> c = new List<C>();

        [XmlElement("C")]
        public List<C> C
        {
            get { return c; }
            set { c = value; }
        }
    }

    public class C
    {
        [XmlAttribute("Name")]
        public string Name { get; set; }
        private List<B> b = new List<B>();

        [XmlElement("B")]
        public List<B> B
        {
            get { return b; }
            set { b = value; }
        }
    }

填充对象(根据您的要求更新):

private A a = new A();
        private void Load()
        {
            a.B.Clear();
            a.Name = string.Empty;
            for (int i = 0; i < 3; i++)
            {
                var tempB = new B();
                tempB.Name = string.Empty;
                for (int j = 0; j < 5; j++)
                {
                    var tempC = new C();
                    tempC.Name = string.Empty;
                    for (int k = 0; k < 3; k++)
                    {
                        var innerChildB = new B();
                        innerChildB.Name = string.Empty;
                        tempC.B.Add(innerChildB);
                    }
                    tempB.C.Add(tempC);
                }
                a.B.Add(tempB);
            }
        }

序列化:

private void Serialize()
        {
            try
            {
                // to Save columnorders to the file
                var serializer = new XmlSerializer(typeof(A));
                var ns = new XmlSerializerNamespaces();
                ns.Add("", "");

                using (TextWriter writer = new StreamWriter(@"D:\Test_Jun13.xml"))
                {
                    serializer.Serialize(writer, a, ns);
                }
            }
            catch { }
        }

反序列化:

private void DeSerialize()
    {
        try
        {
            if (File.Exists(@"D:\Test_Jun13.xml"))
            {
                var deserializer = new XmlSerializer(typeof(A));
                using (TextReader reader = new StreamReader(@"D:\Test_Jun13.xml"))
                {
                    var obj = deserializer.Deserialize(reader);
                    a = (A)obj;
                }
            }
        }
        catch
        {

        }


    }

XML 文件将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<A Name="">
  <B Name="">
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
  </B>
  <B Name="">
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
  </B>
  <B Name="">
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
    <C Name="">
      <B Name="" />
      <B Name="" />
      <B Name="" />
    </C>
  </B>
</A>

这会解决您的问题吗?如果对您有帮助,请不要忘记将其标记为答案