DataContract在子属性中的父引用-如何避免无限序列化循环

本文关键字:何避免 无限 循环 序列化 引用 属性 DataContract | 更新日期: 2023-09-27 17:50:46

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

这里是一组测试控制台代码,可以向您展示我所说的内容。

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();
        }
    }

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

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

DataContract在子属性中的父引用-如何避免无限序列化循环

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

[DataContract(IsReference = true)]