【问题标题】:DataContract Parent reference in child property - how to avoid infinite serialization loop子属性中的 DataContract 父引用 - 如何避免无限序列化循环
【发布时间】:2012-12-19 03:32:56
【问题描述】:

在 WCF 服务中,我有一个数据契约(对象)包含子项的集合(其中集合具有 datamemeber 属性)。子集合中的对象具有对父集合的引用作为属性。如果父对象子集合为空或包含空父引用,一切都很好,但如果父引用已填充且父子集已填充,则它将永远序列化。

这是一组测试控制台代码,向您展示我在说什么。

class Program
    {
        static void Main(string[] args)
        {

            MyParentObject parent = BuildParent();

            string xml = Serializer<MyParentObject>.Serialize(parent);

            System.Console.Write(xml);

            System.Console.ReadKey();

        }

        static MyParentObject BuildParent()
        {

            MyParentObject parent = new MyParentObject();
            parent.MyParentObjectId = 123;
            parent.MyParentObjectName = "Test Parent Object";
            parent.MyChildren = new List<MyChildObject>();

            for (int i = 0; i < 10; i++)
            {
                MyChildObject child = new MyChildObject();
                child.MyParent = parent;
                child.MyChildObjectId = i;
                child.MyChildObjectName = string.Format("Test Child Name {0}", i.ToString());
                parent.MyChildren.Add(child);
            }

            return parent;

        }

    }


    [DataContract]
    public class MyParentObject
    {

        [DataMember]
        public int MyParentObjectId { get; set; }

        [DataMember]
        public string MyParentObjectName { get; set; }

        [DataMember]
        public List<MyChildObject> MyChildren { get; set; }

    }

    [DataContract]
    public class MyChildObject
    {
        [DataMember]
        public MyParentObject MyParent { get; set; }

        [DataMember]
        public int MyChildObjectId { get; set; }

        [DataMember]
        public string MyChildObjectName { get; set; }

    }

public class Serializer<T>
    {

        public static string Serialize(T entity)
        {

            StringBuilder sb = new StringBuilder();


            DataContractSerializer dcs = new DataContractSerializer(typeof(T));

            using (XmlWriter writer = XmlWriter.Create(sb))
            {

                dcs.WriteObject(writer, entity);
                writer.Flush();
            }

            return sb.ToString();
        }

    }

除了清除导致这个无限序列化循环的子/父引用之外,还有什么方法可以解决这个问题吗?

编辑:我知道我可以删除 datamember 属性,但我想保留它,而不是无限序列化。

【问题讨论】:

  • 这样的循环引用通常是一个糟糕的设计选择。

标签: c# .net serialization datacontract


【解决方案1】:

尝试在 DataContract 属性中使用 IsReference 属性

[DataContract(IsReference = true)] 

【讨论】:

  • 太棒了我的朋友……太棒了。
  • 没有问题。恕我直言,它应该默认打开。为了向后兼容,它可能默认关闭。
  • 只是更多信息,在我的情况下,我还必须将此注释放在我的模型继承的基类中。工作正常
猜你喜欢
  • 1970-01-01
  • 2019-05-01
  • 2012-01-23
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
相关资源
最近更新 更多