克隆没有序列化的对象
我在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