C# · 2月 2, 2022

c# – 克隆整个对象图

使用此代码序列化对象时: public object Clone(){ var serializer = new DataContractSerializer(GetType()); using (var ms = new System.IO.MemoryStream()) { serializer.WriteObject(ms,this); ms.Position = 0; return serializer.ReadObject(ms); }}

我注意到它没有复制关系.
有没有办法让这种情况发生?

解决方法 只需使用接受preserveObjectReferences的构造函数重载,并将其设置为true: using System;using System.Runtime.Serialization;static class Program{ public static T Clone<T>(T obj) where T : class { var serializer = new DataContractSerializer(typeof(T),null,int.MaxValue,false,true,null); using (var ms = new System.IO.MemoryStream()) { serializer.WriteObject(ms,obj); ms.Position = 0; return (T)serializer.ReadObject(ms); } } static void Main() { Foo foo = new Foo(); Bar bar = new Bar(); foo.Bar = bar; bar.Foo = foo; // nice cyclic graph Foo clone = Clone(foo); Console.WriteLine(foo != clone); //true – new object Console.WriteLine(clone.Bar.Foo == clone); // true; copied graph }}[DataContract]class Foo{ [DataMember] public Bar Bar { get; set; }}[DataContract]class Bar{ [DataMember] public Foo Foo { get; set; }}