【.NET】 DictionaryCloneable 字典类Dictionary复制
2014-08-06 09:01
344 查看
实现拷贝一份Dictionary数据的类遍历原始Dictionay结构和数据进行赋值工作,性能很差,通过序列化和反序列化的方式来完成数据对象的深度拷贝工作,这种方式快速高效
特别注意:必须添加一个用于反序列化的构造函数,否则会报“未找到反序列化的类型对象的构造函数。”
对于这个错误、我们第一个反应是在反序列化的时候找不到默认(无参)的构造函数。但是再看DictionaryCloneable的定义,我们不曾定义任何构造函数,意味着它具有一个默认(无参)构造函数。实际上,这里并不是找不到默认(无参)构造函数,而是找不到一个具有特殊参数列表的构造函数。该构造函数接收两个参数,类型分别是:SerializationInfo和StreamingContext。所以我们的解决方案很简单,就是加上这么一个构造函数。为此我们从新定义DictionaryCloneable。
[Serializable]
public class DictionaryCloneable<TKey, TValue> : Dictionary<TKey, TValue>,IDictionary<TKey, TValue>, ICloneable
{
public DictionaryCloneable()
{
}
//必须加上此构造函数,在反序列化时被调用,否则会报“未找到反序列化的类型对象的构造函数。”
public DictionaryCloneable(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
: base(info, context)
{
}
public object Clone()
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter Formatter =
new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext(System.Runtime.Serialization.StreamingContextStates.Clone));
System.IO.MemoryStream stream = new System.IO.MemoryStream();
Formatter.Serialize(stream, this);
stream.Position = 0;
object clonedObj = Formatter.Deserialize(stream);
stream.Close();
return clonedObj;
}
}
如果一个类型实现了ISerializable接口(Dictionary<TKey, TValue>就实现了这个接口),你就应该定义如上一个构造函数。这算是一个约定,但是当你继承某个类型的时候,你往往会忘记这个约定。
特别注意:必须添加一个用于反序列化的构造函数,否则会报“未找到反序列化的类型对象的构造函数。”
对于这个错误、我们第一个反应是在反序列化的时候找不到默认(无参)的构造函数。但是再看DictionaryCloneable的定义,我们不曾定义任何构造函数,意味着它具有一个默认(无参)构造函数。实际上,这里并不是找不到默认(无参)构造函数,而是找不到一个具有特殊参数列表的构造函数。该构造函数接收两个参数,类型分别是:SerializationInfo和StreamingContext。所以我们的解决方案很简单,就是加上这么一个构造函数。为此我们从新定义DictionaryCloneable。
[Serializable]
public class DictionaryCloneable<TKey, TValue> : Dictionary<TKey, TValue>,IDictionary<TKey, TValue>, ICloneable
{
public DictionaryCloneable()
{
}
//必须加上此构造函数,在反序列化时被调用,否则会报“未找到反序列化的类型对象的构造函数。”
public DictionaryCloneable(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
: base(info, context)
{
}
public object Clone()
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter Formatter =
new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext(System.Runtime.Serialization.StreamingContextStates.Clone));
System.IO.MemoryStream stream = new System.IO.MemoryStream();
Formatter.Serialize(stream, this);
stream.Position = 0;
object clonedObj = Formatter.Deserialize(stream);
stream.Close();
return clonedObj;
}
}
如果一个类型实现了ISerializable接口(Dictionary<TKey, TValue>就实现了这个接口),你就应该定义如上一个构造函数。这算是一个约定,但是当你继承某个类型的时候,你往往会忘记这个约定。
相关文章推荐
- 智能字典缓存 ISmartDictionaryCache-- ESBasic 可复用的.NET类库(18)
- 对象的深复制与浅复制 实现Cloneable接口实现深复制 序列化实现深复制
- java基础入门补充(002) Cloneable接口 深复制与浅复制
- .Net学习笔记----2015-06-25(File类的读写文件、List泛型集合、装箱和拆箱、Dictionary字典集合)
- Prototype 原型模式 复制 Cloneable clone
- Java编程中实现Cloneable接口,让类的对象可以复制
- Python dictionary字典的复制方法
- 实现Cloneable接口,让类的对象可以复制
- Cloneable和clone的使用,以及深复制与浅复制的区别
- 字典类Dictionary复制
- 接口Cloneable浅复制和深复制
- ESBasic 可复用的.NET类库(18) -- 智能字典缓存 ISmartDictionaryCache
- java的Cloneable、Serializable接口
- php 对象复制(克隆)clone()
- Ojbect-C2 4、NSDictionary和NSMutableDictionary字典的使用
- Python 字典(Dictionary) get()方法
- Python 字典(Dictionary) setdefault()方法
- swift_005(Swift的Dictionary 字典)
- .NET深复制与浅复制
- asp中Dictionary(数据字典)的使用