您的位置:首页 > 编程语言 > C#

C# 克隆对象快捷方法

2014-05-30 16:10 309 查看
经常做UI的同学应该知道, 常常会遇到某项编辑,编辑后可以保存跟不保存。

这个时候你就需要把当前对象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 一个新的对象,然后慢慢为一个属性一个属性赋值。。简直是一件崩溃的事情。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  WPF c#