2

WCFサービスで、子アイテムのコレクションを含むデータコントラクト(オブジェクト)がある状況があります(コレクションにはdatamemeber属性があります)。子コレクション内のオブジェクトには、プロパティとしての親への参照があります。親オブジェクトの子コレクションが空であるか、nullの親参照が含まれている場合はすべて問題ありませんが、親参照が入力され、親子が入力されている場合は、永久にシリアル化されます。

これが私が話していることを示すためのテストコンソールコードのセットです。

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

    }

この無限のシリアル化ループを引き起こす子/親参照をクリアする以外に、これを回避する方法はありますか?

編集:データメンバー属性を削除できることはわかっていますが、それを保持し、単純に無限にシリアル化しないようにします。

4

1 に答える 1

4

DataContract属性でIsReferenceプロパティを使用してみてください

[DataContract(IsReference = true)] 
于 2013-01-04T17:08:31.330 に答える