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内容如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/152791.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QQ浏览器怎么才能设置默认搜索引擎为百度

问题&#xff1a; 打开QQ浏览器&#xff0c;搜索相关信息时发现总是默认为”搜狗搜索引擎“&#xff0c;想将其转为”百度搜索引擎“ 解决&#xff1a; 1、点击浏览器右侧”菜单“图标&#xff0c;选择”设置“&#xff0c;如下图所示&#xff1a; 2、在”常规设置“中的”搜…

MAC版Gradle构建Spring5.X源码阅读环境

前言&#xff1a; 三年前鄙人有幸在现已几乎报废的Window的DELL中搭建过Spring源码环境&#xff0c;今天&#xff0c;Mac版的搭建&#xff0c;来了。 本篇文章环境搭建&#xff1a;Spring5.2.1 Gradle5.6.3-all jdk8 IDEA2022.3版本 文章目录 1、Spring源码下载2、Gradle下载…

教资一年可以考几次 教资考试每年次数介绍

教师资格证一年可以考两次。根据教师资格证考试规定&#xff0c;为了满足报考人员的工作需求&#xff0c;达到市场供求均衡的状态&#xff0c;教师资格证区别于其他的技术资格类的考试&#xff0c;会每年举行两次考试&#xff0c;分别在上半年和下半年各举行一次考试。 上半年…

运行软件找不到mfc140u.dll怎么解决,mfc140u.dll是什么文件

"找不到 mfc140u.dll"是一条错误信息&#xff0c;表示您的计算机上缺少一个名为 mfc140u.dll 的动态链接库&#xff08;DLL&#xff09;文件。这个文件通常与 Microsoft Visual C Redistributable 相关。Mfc140u.dll 是 Microsoft 基础类库&#xff08;MFC&#xff0…

React组件

一、React组件 函数组件 // 函数组件 // 组件的名称必须首字母大写 // 函数组件必须有返回值 如果不需要渲染任何内容&#xff0c;则返回 null function HelloFn () {return <div>这是我的第一个函数组件!</div> }// 定义类组件 function App () {return (<di…

动态代理IP常见超时原因及解决方法

在使用动态代理IP时&#xff0c;常常会遇到代理超时的问题。网络环境的不稳定性以及代理IP的质量问题&#xff0c;都可能会引起代理超时。这种情况下&#xff0c;代理服务器无法在规定时间内响应我们的请求&#xff0c;导致请求失败。 使用动态代理IP时&#xff0c;哪些原因会引…

iPhone15系类LDR6020P 超简外围手机转接器/拓展坞方案

目前市面上的手机大部分已经取消3.5音频耳机接口&#xff0c;仅仅保留了Type-c口。但是追求音质和零延迟的用户仍然会选择3.5mm有线耳机&#xff0c;因为在玩手机游戏的时候&#xff0c;音画不同步真的很影响游戏体验&#xff0c;所以Type-C转3.5mm接口线应运而生。 #iPhone15…

Maven聚合项目配合Springcloud案例

创建maven项目 导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

LeetCode 1251. 平均售价

题目链接&#xff1a;1251. 平均售价 题目描述 表&#xff1a;Prices Column NameTypeproduct_idintstart_datedateend_datedatepriceint (product_id&#xff0c;start_date&#xff0c;end_date) 是 prices 表的主键&#xff08;具有唯一值的列的组合&#xff09;。 price…

大数据学习(1)-Hadoop

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博>主哦&#x…

RTC 时间、闹钟

实时时钟RTC是一个独立的定时器。RTC模块拥有一个连续计数的计数器&#xff0c;在软件配置下&#xff0c;可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在掉电情况下 RTC仍可以独立运行 只要芯片的备用电源…

材质、纹理、贴图的区别和关联

1、材质、纹理、贴图的概念 材质&#xff08;Material&#xff09;、纹理&#xff08;Texture&#xff09;、贴图&#xff08;Texture Map&#xff09;是计算机图形学中的三个概念&#xff0c;它们之间存在关系但也有一些区别。 材质&#xff08;Material&#xff09;是描述物…

java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

WIN10 NPM的安装

引言&#xff1a; 什么是node.js? javaScript是一门脚本语言&#xff0c;通常被用来编写、执行本地源代码。脚本语言需要一个解析器才能运行&#xff0c;HTML文件中的JavaScript代码由浏览器解析执行。而自行执行JavaScript代码则需要Node.js解析器才能运行。 每个解析器都…

放大招,百度文心大模型4.0正在加紧训练,即将发布

插播一条快讯&#xff01; &#xfeff;&#xfeff;刚刚看到一篇报道&#xff0c;说百度正在加紧训练文心大模型4.0&#xff01;百度5月发布了文心大模型3.5&#xff0c;才4个多月又要发布4.0了&#xff0c;这迭代速度简直了。据说这次发布将在10月17日百度世界大会上进行&am…

【AI】深度学习——人工智能、深度学习与神经网络

文章目录 0.1 如何开发一个AI系统0.2 表示学习(特征处理)0.2.1 传统特征学习特征选择过滤式包裹式 L 1 L_1 L1​ 正则化 特征抽取监督的特征学习无监督的特征学习 特征工程作用 0.2.2 语义鸿沟0.2.3 表示方式关联 0.2.4 表示学习对比 0.3 深度学习0.3.1 表示学习与深度学习0.3.…

OpenCV3-Python(7)模板匹配和霍夫检测

模板匹配 膜版匹配不能匹配尺度变换和视角变换的图像 图片中查找和模板相似度最高的图像 计算相似程度最高的位置 res cv.matchTemplate(img , template, method) 该方法返回一个类似灰度图的东西&#xff0c;如果用的相关匹配&#xff0c;那么亮的地方就是可能匹配上的地方 …

redis 事物

Redis事务 一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令 正常执行 放弃事务 在exec执行之前&#xff0c;报错&#xff0c;则所有命令都不会执行 在exec执行后&#xff0c;报错&#xff0c;则其它正确的指令会执行&#xff0c;错误的命令会抛弃 watch 监…

文化主题公园旅游景点3d全景VR交互体验加深了他们对历史文化的认知和印象

如今&#xff0c;沉浸式体验被广泛应用于文旅行业&#xff0c;尤其是在旅游演艺活动中。在许多城市&#xff0c;沉浸式旅游演艺活动已成为游客“必打卡”项目之一。因其独特体验和强互动性&#xff0c;这类演艺活动不仅吸引了外地游客&#xff0c;也吸引了本地观众。 随着信息化…

JuiceFS 目录配额功能设计详解

JuiceFS 在最近 v1.1 版本中加入了社区中呼声已久的目录配额功能。已发布的命令支持为目录设置配额、获取目录配额信息、列出所有目录配额等。完整的详细信息&#xff0c;请查阅文档。 在设计此功能时&#xff0c;对于它的统计准确性&#xff0c;实效性以及对性能的影响&#…