C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化或反序列化报错解决方法
一、问题描述
在使用C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化报错【System.Exception:“不支持类型 System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]],因为它实现 IDictionary。”】如下所示:

或反序列化操作时会报如下错误【System.Exception:“不支持类型 System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]],因为它实现 IDictionary。”】如下图所示

二、问题分析
通过异常信息可以看到是由于XML序列化或反序列化程序导致报错,且该错误是由于IDictionary导致,通过反编译查看【System.Xml.Serialization.TypeScope】内容可以发现代码直接对IDictionary类型直接做返回异常处理,不让序列化或反序列化。

三、解决方法
1、创建一个新的类【DictionaryEx】,继承Dictionary<TKey, TValue>类和IXmlSerializable接口:
using System.Collections.Generic;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;namespace Kernal
{#region 可序列化字典类 + public class DictionaryEx<TKey, TValue>/// <summary>/// 可序列化字典类/// </summary>/// <typeparam name="TKey">键泛型</typeparam>/// <typeparam name="TValue">值泛型</typeparam>[System.Serializable]public class DictionaryEx<TKey, TValue>: Dictionary<TKey, TValue>, IXmlSerializable{#region 构造函数#region 默认构造函数 + public DictionaryEx()/// <summary>/// 默认构造函数/// </summary>public DictionaryEx(): base(){}#endregion#region 构造函数 + public DictionaryEx(int capacity)/// <summary>/// 构造函数/// </summary>/// <param name="capacity">可包含的初始元素数</param>public DictionaryEx(int capacity): base(capacity){}#endregion#region 构造函数 + public DictionaryEx(IEqualityComparer<TKey> comparer)/// <summary>/// 构造函数/// </summary>/// <param name="comparer">比较键时要使用的 比较器 实现,或者为 null,以便为键类型使用默认的 比较器</param>public DictionaryEx(IEqualityComparer<TKey> comparer): base(comparer){}#endregion#region 构造函数 + public DictionaryEx(IDictionary<TKey, TValue> dictionary)/// <summary>/// 构造函数/// </summary>/// <param name="dictionary">初始数据</param>public DictionaryEx(IDictionary<TKey, TValue> dictionary): base(dictionary){}#endregion#region 构造函数 + public DictionaryEx(int capacity, IEqualityComparer<TKey> comparer)/// <summary>/// 构造函数/// </summary>/// <param name="capacity">可包含的初始元素数</param>/// <param name="comparer">比较键时要使用的 比较器 实现,或者为 null,以便为键类型使用默认的 比较器</param>public DictionaryEx(int capacity, IEqualityComparer<TKey> comparer): base(capacity, comparer){}#endregion#region 构造函数 + public DictionaryEx(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer)/// <summary>/// 构造函数/// </summary>/// <param name="dictionary">初始数据</param>/// <param name="comparer">比较键时要使用的 比较器 实现,或者为 null,以便为键类型使用默认的 比较器</param>public DictionaryEx(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer): base(dictionary, comparer){}#endregion#endregion#region 取得概要 + public XmlSchema GetSchema()/// <summary>/// 取得概要/// 注:根据MSDN的文档,此方法为保留方法,一定返回 null。/// </summary>/// <returns>Xml概要</returns>public XmlSchema GetSchema(){return null;}#endregion#region 从 XML 对象中反序列化生成本对象 + public void ReadXml(XmlReader reader)/// <summary> /// 从 XML 对象中反序列化生成本对象/// </summary> /// <param name="reader">包含反序列化对象的 XmlReader 流</param> public void ReadXml(XmlReader reader){XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));bool wasEmpty = reader.IsEmptyElement;reader.Read();if (wasEmpty) return;while (reader.NodeType != XmlNodeType.EndElement){reader.ReadStartElement("Item");reader.ReadStartElement("Key");TKey key = (TKey)keySerializer.Deserialize(reader);reader.ReadEndElement();reader.ReadStartElement("Value");TValue value = (TValue)valueSerializer.Deserialize(reader);reader.ReadEndElement();this.Add(key, value);reader.ReadEndElement();reader.MoveToContent();}reader.ReadEndElement();}#endregion#region 将本对象序列化为 XML 对象 + public void WriteXml(XmlWriter writer)/// <summary> /// 将本对象序列化为 XML 对象/// </summary> /// <param name="writer">待写入的 XmlWriter 对象</param> public void WriteXml(XmlWriter writer){XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));foreach (TKey key in this.Keys){writer.WriteStartElement("Item");writer.WriteStartElement("Key");keySerializer.Serialize(writer, key);writer.WriteEndElement();writer.WriteStartElement("Value");TValue value = this[key];valueSerializer.Serialize(writer, value);writer.WriteEndElement();writer.WriteEndElement();}}#endregion}#endregion
}
2、将原来使用Dictionary的类替换为DictionaryEx类
/// <summary>/// 保存语言信息/// </summary>private bool SaveFileExpandNameList(DictionaryEx<string,string> languageInfoDic, string languageFilePathAndName){bool success = false;if (languageInfoDic != null && languageInfoDic.Count >= 0){//将对象序列化为xml字符串string strXml = XmlHelper.ObjectToXml2(languageInfoDic);if (!string.IsNullOrEmpty(strXml)){//先清空文件FileOPC.Clear(languageFilePathAndName);//保存Json字符串文件(覆盖写入)success = FileOPC.OverWrite(languageFilePathAndName, strXml);}}return success;}/// <summary>/// 获取语言信息/// </summary>/// <returns>返回语言信息字典</returns>private DictionaryEx<string, string> GetLanguageInfo(string languageFilePathAndName){if (string.IsNullOrEmpty(languageFilePathAndName)) return null;DictionaryEx<string, string> languageInfoDic = new DictionaryEx<string, string>();//读取xml文件字符串string strXml = FileOPC.Read(languageFilePathAndName);//读取xml文件并序列化为对象languageInfoDic = XmlHelper.XmlToObject2<DictionaryEx<string, string>>(strXml);return languageInfoDic;}
3、序列化DictionaryEx<TKey, TValue>容器内容的XML内容如下所示:

相关文章:
C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化或反序列化报错解决方法
一、问题描述 在使用C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化报错【System.Exception:“不支持类型 System.Collections.Generic.Dictionary2[[System.String, mscorlib, Version2.0.0.0, Cultureneutral, PublicKeyTokenb77a5c561934e089],[System.Strin…...
【Linux】Linux 之用户管理
Linux 之用户管理 1.Linux 下的用户2.配置文件3.用户管理3.1 useradd3.1.1 创建用户并指定用户 ID3.1.2 指定用户的主目录3.1.3 指定用户的主组 3.2 adduser3.3 userdel3.4 密码文件3.4.1 字段含义解释3.4.2 给用户添加密码 3.5 其他与用户相关的命令 4.修改用户的信息4.1 user…...
NLP:Attention和self-attention的区别
核心思想是根据不同的上下文为不同的信息分配不同的注意力权重 效果: Attention:它允许模型在解码时聚焦于输入的特定部分,从而更好地捕获上下文信息。Self-attention:它帮助模型捕获输入序列内部的关系,无论这些关系…...
Gap Year Plan
Gap Year Plan gap year 几个大方向 健康 60 KG10 新朋友 钱 5W RMB基本常识、社会机制补齐开网店 英语 TOELF日常交流 & 面试 口语Science Research Writing 2nd 课程 科研常识CMU 15-445MIT 6.824CMU 15-721Full Stack OpenDDIA 实习 GSOC 2024 PostgreSQL / …...
厌烦了iPhone默认的热点名称?如何更改iPhone上的热点名称
你对你默认的热点名称感到厌倦了吗?这篇文章是为你准备的。在这里,你可以了解如何轻松更改iPhone上的热点名称。 个人热点会将你的手机数据转换为Wi-Fi信号。手机上的个人热点使用户能够与其他用户共享其蜂窝数据连接。当你在WIFI网络之外时,…...
【数据库审计】2023年数据库审计厂家汇总
我们大家都知道数据库审计的重要意义,不仅可以满足等保合规,还能进行风险告警,保障数据安全。那你知道目前市面上数据库审计厂家有哪些吗?这里小编就给大家汇总一下。 2023年数据库审计厂家汇总 1、行云管家 2、安恒信息 3、…...
C#WPF StackPanel布局及Border边框应用实例
本文介绍C#WPF StackPanel布局及Border边框应用实例,通过演示掌握StackPanel布局及Border边框用法,并对对齐方式、边距、尺寸设置、Border的圆角使用作了演示。 具体概念本文不再赘述。 Xaml文件: <Windowx:Class="PropertyDemo.MainWindow"xmlns="htt…...
RabbitMQ-第四种交换机类型
接上文 RabbitMQ-主题模式 1 第四种交换机类型 header:它是根据头部信息来决定的,在我们发送的消息中是可以携带一些头部信息的,类似与HTTP,我们可以根据这些头部信息来决定路由到哪一个消息队列中。 修改配置类内容 Configuration public…...
Redis AOF重写原原理
重写aof之前 appendonly.aof.1.base.aof appendonly.aof.1.incr.aof appendonly.aof.manifest 重写aof 一次 appendonly.aof.2.base.aof 大小变化 appendonly.aof.2.incr.aof 大小o appendonly.aof.manifest 大小不变 AOF文件重写并不是对原文件进行重新整理,而是直…...
es6.x和es7.x如何创建索引?
一、es6.x {"settings": {"number_of_shards": "2","number_of_replicas": "2","max_result_window": 100000},"mappings": {"doc": {"dynamic": "strict","prope…...
《DevOps 精要:业务视角》- 读书笔记(三)
DevOps 精要:业务视角(三) 第3章 原则3.1 价值流3.2 部署流水线3.3 一切都应存储在版本控制系统中3.4 自动化配置管理3.5 完成的定义3.6 小结 第3章 原则 将原则从实践中分离出来,这是一种很有用的做法。当然了,这两个词分别有着…...
C语言——文件操作_学习笔记
一、引言——为什么使用文件 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的…...
cap分布式理论
cap 理论 cap是实现分布式系统的思想。 由3个元素组成。 Consistency(一致性) 在任何对等 server 上读取的数据都是最新版,不会读取出旧数据。比如 zookeeper 集群,从任何一台节点读取出来的数据是一致的。 Availability&…...
asp.net core 如何统一json序列化格式
oldconfig.AllFields Newtonsoft.Json.JsonConvert.SerializeObject(sqlParameters.AllFields);在start.cs文件中 JsonConvert.DefaultSettings new Func<JsonSerializerSettings>(() >{JsonSerializerSettings jsonsetting new JsonSerializerSettings(){Formatt…...
DALL·E 3 ChatGPT-4的梦幻联动
核心内容:DALLE 3 & ChatGPT-4的梦幻联动 hello,我是小索奇,最近DALL结合ChatGPT4的话题逐渐上升了起来,今天就带大家探索一下~ DALLE的主要功能是根据文本描述来生成图片。你可以告诉它一个穿着皮草的西瓜,它就能…...
linux,write:xxx has messages disabled 与 Ubuntu多用户同时登录的问题 ubuntu 20.04
write:xxx has messages disabled 问题 被这问题折磨了好久,搜都搜不到,还是灵机一动想到的。 很多 帖子说,要使用 mesg y用了还是没有用,后面我登录了很多用户,发现只有root用户可以给别的用户使用write…...
ffmpeg批量转换ape/wav为mp3 (linux, mac适用)
在保存了ape文件的文件夹下建一个mp3子目录,打开终端并进入ape目录,然后执行脚本(直接粘贴到终端上面,回车键执行): for i in *.apedo ffmpeg -i "$i" -y -acodec libmp3lame -aq 0 "./mp3…...
自动生成JPA bean及repository生成简陋工具
因为工具不太灵活,手写了一个,没啥技术难度,纯堆代码量 import java.io.File; import java.io.FileOutputStream; import java.nio.charset.Charset; import java.sql.*; import java.util.*;/*** JPA dao自动生成工具*/ public class JpaGe…...
vue3+vite+uniapp 封装一个省市区组件
一、预览图 二、使用前的一些注意事项 只支持在 uniapp vue3 项目中使用支持微信小程序和h5 (app端没有测试过)ui库用的 uview-plus省市区数据用的是 vant-ui 提供的一个赖库 vant/area-data 三、组件代码 <template><u-popup :show"show" type"botto…...
OpenCV报错:AttributeError: module ‘cv2.cv2‘ has no attribute ‘SIFT_create‘
报错位置: sift cv2.SIFT_create()报错原因:opencv将SIFT等算法整合到xfeatures2d集合里面了。 改为: sift cv2.xfeatures2d.SIFT_create()...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
