Csharp/C#教程:克隆没有序列化的对象分享


克隆没有序列化的对象

我在SO处找到了许多解决方案,而且是通过序列化/反序列化(进入内存和返回)处理对象的深层克隆。

它要求克隆的类用[Serializable]标记。 我碰巧把我的类(大部分都是)用[DataContract]标记,因为我使用DataContractSerializer来序列化为XML。

我只引入了[Serializable]属性,因为需要深度克隆其中一些类实例。 但是,现在通过DCS序列化/反序列化发生了一些事情,因为它不再起作用了 – 关于在反序列化时期望不同的XML元素的错误。 如果我删除[Serializable] ,错误就消失了。

我有什么选择? 我只想尽可能简单地深入克隆我的对象。

这很有效

  public static T DeepClone(this T a) { using (MemoryStream stream = new MemoryStream()) { DataContractSerializer dcs = new DataContractSerializer(typeof(T)); dcs.WriteObject(stream, a); stream.Position = 0; return (T)dcs.ReadObject(stream); } } 

Json序列化和反序列化应该可以工作,它不需要类具有序列化注释。

 public static T DeepCopy(this T source) { return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source)); } 

以下是如何使用它:

 var oldList = new List(); var newList = oldList.Clone(); 

使用这些方法:

上述就是C#学习教程:克隆没有序列化的对象分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 public static T Clone(this T o) where T : new() { return (T)CloneObject(o); } static object CloneObject(object obj) { if (ReferenceEquals(obj, null)) return null; var type = obj.GetType(); if (type.IsValueType || type == typeof(string)) return obj; else if (type.IsArray) { var array = obj as Array; var arrayType = Type.GetType(type.FullName.Replace("[]", string.Empty)); var arrayInstance = Array.CreateInstance(arrayType, array.Length); for (int i = 0; i < array.Length; i++) arrayInstance.SetValue(CloneObject(array.GetValue(i)), i); return Convert.ChangeType(arrayInstance, type); } else if (type.IsClass) { var instance = Activator.CreateInstance(type); var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (var field in fields) { var fieldValue = field.GetValue(obj); if (ReferenceEquals(fieldValue, null)) continue; field.SetValue(instance, CloneObject(fieldValue)); } return instance; } else return null; } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1009438.html

(0)
上一篇 2021年12月30日
下一篇 2021年12月30日

精彩推荐