使用此代码序列化对象时:
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; } }
原文地址:https://www.jb51.cc/csharp/98055.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。