克隆整个对象图

使用此代码序列化对象时:

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

使用[DataContract]注释您的类,或者在DatacontractSerializer的构造函数中添加您的子类型。

 var knownTypes = new List {typeof(Class1), typeof(Class2), ..etc..}; var serializer = new DataContractSerializer(GetType(), knownTypes); 

要执行深度克隆,您可以考虑使用二进制序列化程序:

 public static object CloneObject(object obj) { using (var memStream = new MemoryStream()) { var binaryFormatter = new BinaryFormatter( null, new StreamingContext(StreamingContextStates.Clone)); binaryFormatter.Serialize(memStream, obj); memStream.Seek(0, SeekOrigin.Begin); return binaryFormatter.Deserialize(memStream); } } 

在序列化/反序列化步骤中,您需要二进制序列化程序来保留对象标识。