C# 克隆对象快捷方法
2014-05-30 16:10
309 查看
经常做UI的同学应该知道, 常常会遇到某项编辑,编辑后可以保存跟不保存。
这个时候你就需要把当前对象clone 一份出来编辑才可以。
其实object对象自己有clone的方法:MemberwiseClone() 方法,创建当前 object 的浅表副本。
但是因为是浅表副本,所以里面的引用类型是无法复制。当然,可以考虑用结构struc它操作,如果数据量大可能会影响效率,解决方法还是有很多的。
今天遇到的时候就在想,有没有方便快捷的方法呢?。。突然灵光一闪。。有的,那就是:序列化反序列化一次就OK了。
具体是用到自己写的一个序列化的help类:
至于怎么用。。就简单暴力:
搞定。。。自己测试一下。。没问题了。
PS:以前没想到这方法时候还是用最原始的。。new 一个新的对象,然后慢慢为一个属性一个属性赋值。。简直是一件崩溃的事情。
这个时候你就需要把当前对象clone 一份出来编辑才可以。
其实object对象自己有clone的方法:MemberwiseClone() 方法,创建当前 object 的浅表副本。
但是因为是浅表副本,所以里面的引用类型是无法复制。当然,可以考虑用结构struc它操作,如果数据量大可能会影响效率,解决方法还是有很多的。
今天遇到的时候就在想,有没有方便快捷的方法呢?。。突然灵光一闪。。有的,那就是:序列化反序列化一次就OK了。
具体是用到自己写的一个序列化的help类:
public static class SerializerHelper<T> { private static XmlSerializer xmlSerializer; private static XmlSerializer GetXmlSerializer() { if (xmlSerializer == null) xmlSerializer = new XmlSerializer(typeof(T)); return xmlSerializer; } public static string XmlSerialize(T obj) { StringBuilder xml = new StringBuilder(); using (TextWriter text = new StringWriter(xml)) { XmlSerializer serializer = GetXmlSerializer(); serializer.Serialize(text, obj); } return xml.ToString(); } public static void XmlSerialize(Stream stream, T obj) { XmlSerializer serializer = GetXmlSerializer(); serializer.Serialize(stream, obj); } public static void XmlSerialize(string file, T obj) { using (FileStream fs = File.OpenWrite(file)) { XmlSerialize(fs, obj); } } public static T XmlDeserializeStr(string xmlString) { StringBuilder buffer = new StringBuilder(); buffer.Append(xmlString); XmlSerializer serializer = GetXmlSerializer(); using (TextReader reader = new StringReader(buffer.ToString())) { return (T)serializer.Deserialize(reader); } } public static T XmlDeserialize(Stream stream) { XmlSerializer serializer = GetXmlSerializer(); return (T)serializer.Deserialize(stream); } public static T XmlDeserialize(string file) { using (FileStream fs = File.OpenRead(file)) { return XmlDeserialize(fs); } } }
至于怎么用。。就简单暴力:
return SerializerHelper<T>.XmlDeserializeStr(SerializerHelper<T>.XmlSerialize(this));
搞定。。。自己测试一下。。没问题了。
PS:以前没想到这方法时候还是用最原始的。。new 一个新的对象,然后慢慢为一个属性一个属性赋值。。简直是一件崩溃的事情。
相关文章推荐
- 对象间通信方法之一:通过委托实现(C#语言)
- C#对象数组排序方法
- C#中的深复制和浅复制(在C#中克隆对象)
- c# 中 List能对T对象排序的方法
- C#中的深复制和浅复制(在C#中克隆对象)
- C#中完美克隆引用类型的对象
- C#下Socket对象的BeginReceive方法,执行后竟然不调用AsyncCallback里的回调函数
- C#中的几个线程同步对象方法
- 3、步步为营VS 2008 + .NET 3.5(3) - C# 3.0新特性之Automatic Properties(自动属性)、Object Initializers(对象初始化器)、Collection Initializers(集合初始化器)和Extension Methods(扩展方法)
- C#对象克隆的战争
- C#对象数组排序方法
- .net C# 如何判断一个对象是否具有某个方法
- 一个克隆对象的C#基类
- C#两种创建快捷方式的方法
- C#对象数组排序方法
- [C#] C#中对象相等性比较方法的区别
- C#面向对象设计模式纵横谈(四) --- Factory Method 工厂方法(创建型模式)
- C#对象数组排序方法
- C# 3.0新特性之Automatic Properties(自动属性)、Object Initializers(对象初始化器)、Collection Initializers(集合初始化器)和Extension Methods(扩展方法)
- c#中的3种对象比较方法