1、实现拷贝一份Dictionary数据的类

遍历原始Dictionay结构和数据进行赋值工作,性能很差,通过序列化和反序列化的方式来完成数据对象的深度拷贝工作,这种方式快速高效

[Serializable]
    public class DictionaryCloneable<TKey, TValue> : Dictionary<TKey, TValue>,IDictionary<TKey, TValue>, ICloneable
    {
        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;
        }
    }

实现深度拷贝工作,只需这个类继承ICloneable接口,通过BinaryFormatter序列化器,首先先将对象实例序列化写入内存流中,然后反序列化流,返回反序列化对象即可。

2、特别注意:必须添加一个用于反序列化的构造函数,否则会报“未找到反序列化的类型对象的构造函数。”
对于这个错误、我们第一个反应是在反序列化的时候找不到默认(无参)的构造函数。但是再看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>就实现了这个接口),你就应该定义如上一个构造函数。这算是一个约定,但是当你继承某个类型的时候,你往往会忘记这个约定。

3、使用

public volatile Dictionary<int, CommControls.EnumCameraStyle> DicCameraStyleTemp = new Dictionary<int, CommControls.EnumCameraStyle>();
  objec t obj = DicCameraStyle.Clone();  
  DicCameraStyleTemp = obj as Dictionary<int, CommControls.EnumCameraStyle>;
  DicCameraStyle.Clear();

字典类Dictionary复制相关推荐

  1. 【.NET】 DictionaryCloneable 字典类Dictionary复制

    实现拷贝一份Dictionary数据的类遍历原始Dictionay结构和数据进行赋值工作,性能很差,通过序列化和反序列化的方式来完成数据对象的深度拷贝工作,这种方式快速高效 特别注意:必须添加一个用于 ...

  2. C#中的Dictionary字典类介绍(转载)

    C#中的Dictionary字典类介绍 关键字:C# Dictionary 字典  作者:txw1958 原文:http://www.cnblogs.com/txw1958/archive/2012/ ...

  3. Python字典(Dictionary)操作全解【创建、读取、修改、添加、删除、有序字典、浅复制、排序】

    字典是"键-值"对的无序可变序列,字典中的每个元素可以分为两部分,"键"和"值".定义字典时,每个元素的"键"和&quo ...

  4. 列表(list)、元组(tuple)、字典(dictionary)、array(数组)-numpy、DataFrame-pandas 、集合(set)...

    一.列表(list) 一组有序项目的集合.可变的数据类型[可进行增删改查] 列表是以方括号"[]"包围的数据集合,不同成员以","分隔. 列表中可以包含任何数据 ...

  5. java字典类_Java字典类

    java字典类 Java Dictionary is an abstract class. It was the parent class for any key-value mapping obje ...

  6. python 字典的值可以为集合吗_Python 集合(Set)、字典(Dictionary)

    集合(Set) 集合是无序的,无序也就没有索引,不能进行索引相关的操作.无序,python解释器就不能通过索引(位置)区分集合中的相同元素,所以集合中不能有相同的元素. 集合用大括号{  }表示. 集 ...

  7. 编码字典类特征、使用sklearn的DictVectorizer方法将字典组成的列表转换成向量、详解及实战

    编码字典类特征.使用sklearn的DictVectorizer方法将字典组成的列表转换成向量.详解及实战 sklearn.feature_extraction.DictVectorizer() 把字 ...

  8. [导入]基类的复制控制函数

    构造函数不能定义为virtual,派生类对象的基类数据成员部分在初始化列表中用基类构造函数初始化: 基类析构函数应定义为virtual,复制操作符一般定义为非virtual 在基类构造函数和析构函数中 ...

  9. (38)System Verilog类class复制详解

    (38)System Verilog类class复制详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类class复制详解 5)结语 ...

最新文章

  1. [译稿]同步复制提议 2010-09
  2. vue.js初识(一)
  3. find 是区分大小写的。对于不区分大小写的写法(转载)
  4. PHP中header函数的用法及其注意重点是什么呢
  5. 【Java】Java调用shell脚本
  6. Exchange 迁移 Public Folder 公共文件夹
  7. Hypothesis Testing
  8. java读取bny_java转义字符
  9. pythongui项目实例_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...
  10. EasyRecovery如何恢复md文件
  11. [深大深鸿会]利用DevEco Studio从零开发OpenHarmony小游戏——2048(上)
  12. 相关系数excel_怎样征服老板?教你用excel找到数据之间隐藏信息
  13. matplotlib绘制树形图之基本配置——万能模板案例
  14. 国产UOS系统之——安装N卡驱动(多屏显示)
  15. 基本绘图全面攻略——turtle(海龟)库 Python
  16. maven jar坐标和doc引入中央创库没有的jar
  17. Python制作自己的软件安装包程序
  18. Linux中make, make install命令分别是什么,用法?
  19. Pytorch实现性别识别,男女分类
  20. 推荐下Python的IDE:PyScripter,Spyder以及使用心得分享

热门文章

  1. java aviator_Aviator——让表达式飞起来
  2. widnows监控linux 内存,Linux_带你全面了解Linux系统内存监控,在Windows系统中查看内存的使用 - phpStudy...
  3. java命名规范--入门Java程序员必看
  4. 个人算法题精简导航整理(精炼汇总,含知识点、模板题、题单)
  5. 工业互联网平台会出现“一统天下”的操作系统吗?
  6. 30岁转行,逃离通信拥抱互联网(上)
  7. Java基础-->一篇讲全Java常用类(详细易懂,建议收藏)
  8. 关于MyBatis的Example类详解
  9. the type parameter is hiding the type
  10. java程序员平时使用的软件(62款)