استنساخ الرسم البياني كائن كامل
-
19-09-2019 - |
سؤال
أثناء استخدام هذا الرمز لتسليط كائن:
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; }
}
نصائح أخرى
إما أن تعلق فصولك [DataContract]
أو أضف أنواع طفلك في منشئ DataconctractSerializer.
var knownTypes = new List<Type> {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);
}
}
تحتاج إلى تسلسل ثنائي للحفاظ على هوية الكائنات أثناء خطوة التسلسل / التحيز.
لا تنتمي إلى StackOverflow