当前位置: 首页 > news >正文

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的区别

核心思想是根据不同的上下文为不同的信息分配不同的注意力权重 效果&#xff1a; Attention&#xff1a;它允许模型在解码时聚焦于输入的特定部分&#xff0c;从而更好地捕获上下文信息。Self-attention&#xff1a;它帮助模型捕获输入序列内部的关系&#xff0c;无论这些关系…...

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上的热点名称

你对你默认的热点名称感到厌倦了吗&#xff1f;这篇文章是为你准备的。在这里&#xff0c;你可以了解如何轻松更改iPhone上的热点名称。 个人热点会将你的手机数据转换为Wi-Fi信号。手机上的个人热点使用户能够与其他用户共享其蜂窝数据连接。当你在WIFI网络之外时&#xff0c…...

【数据库审计】2023年数据库审计厂家汇总

我们大家都知道数据库审计的重要意义&#xff0c;不仅可以满足等保合规&#xff0c;还能进行风险告警&#xff0c;保障数据安全。那你知道目前市面上数据库审计厂家有哪些吗&#xff1f;这里小编就给大家汇总一下。 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:它是根据头部信息来决定的&#xff0c;在我们发送的消息中是可以携带一些头部信息的&#xff0c;类似与HTTP&#xff0c;我们可以根据这些头部信息来决定路由到哪一个消息队列中。 修改配置类内容 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文件重写并不是对原文件进行重新整理&#xff0c;而是直…...

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 精要:业务视角&#xff08;三&#xff09; 第3章 原则3.1 价值流3.2 部署流水线3.3 一切都应存储在版本控制系统中3.4 自动化配置管理3.5 完成的定义3.6 小结 第3章 原则 将原则从实践中分离出来&#xff0c;这是一种很有用的做法。当然了&#xff0c;这两个词分别有着…...

C语言——文件操作_学习笔记

一、引言——为什么使用文件 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进行持久化的…...

cap分布式理论

cap 理论 cap是实现分布式系统的思想。 由3个元素组成。 Consistency&#xff08;一致性&#xff09; 在任何对等 server 上读取的数据都是最新版&#xff0c;不会读取出旧数据。比如 zookeeper 集群&#xff0c;从任何一台节点读取出来的数据是一致的。 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的梦幻联动

核心内容&#xff1a;DALLE 3 & ChatGPT-4的梦幻联动 hello&#xff0c;我是小索奇&#xff0c;最近DALL结合ChatGPT4的话题逐渐上升了起来&#xff0c;今天就带大家探索一下~ DALLE的主要功能是根据文本描述来生成图片。你可以告诉它一个穿着皮草的西瓜&#xff0c;它就能…...

linux,write:xxx has messages disabled 与 Ubuntu多用户同时登录的问题 ubuntu 20.04

write&#xff1a;xxx has messages disabled 问题 被这问题折磨了好久&#xff0c;搜都搜不到&#xff0c;还是灵机一动想到的。 很多 帖子说&#xff0c;要使用 mesg y用了还是没有用&#xff0c;后面我登录了很多用户&#xff0c;发现只有root用户可以给别的用户使用write…...

ffmpeg批量转换ape/wav为mp3 (linux, mac适用)

在保存了ape文件的文件夹下建一个mp3子目录&#xff0c;打开终端并进入ape目录&#xff0c;然后执行脚本&#xff08;直接粘贴到终端上面&#xff0c;回车键执行&#xff09;&#xff1a; for i in *.apedo ffmpeg -i "$i" -y -acodec libmp3lame -aq 0 "./mp3…...

自动生成JPA bean及repository生成简陋工具

因为工具不太灵活&#xff0c;手写了一个&#xff0c;没啥技术难度&#xff0c;纯堆代码量 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‘

报错位置&#xff1a; sift cv2.SIFT_create()报错原因&#xff1a;opencv将SIFT等算法整合到xfeatures2d集合里面了。 改为&#xff1a; sift cv2.xfeatures2d.SIFT_create()...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...