使用 XmlSerializer 列表反序列化为字典

2023-12-13

我通过将 Dictionary 转换为 List 将数据序列化为 xml。
序列化没问题。

是否可以在反序列化时填充字典? (现在我在反序列化完成并返回列表后填充字典)

 [Serializable]
    public class Attribute
    {
        public string Key { get; set; }
        public int Value1 { get; set; }
        public int Value2 { get; set; }
        public int Value3 { get; set; }


        public Attribute() { }
        public Attribute(string key, int value1, int value2, int value3)
        {
            Key = key;
            Value1 = value1;
            Value2 = value2;
            Value3 = value3;
        }
    }

    [XmlRoot("Container")]    
    public class TestObject
    {
        public TestObject() { }
        private Dictionary<string, Attribute> dictionary = new Dictionary<string, Attribute>();


        [XmlIgnore()]
        public Dictionary<string, Attribute> Dictionary
        {
            set { dictionary = value; }
            get { return dictionary; }
        }

        public string Str { get; set; }        


        private List<Attribute> _attributes = new List<Attribute>();       
        public List<Attribute> Attributes
        {
            get 
            {
                if (Dictionary.Count>0)
                {

                    foreach (string key in Dictionary.Keys)
                    {
                        _attributes.Add(new Attribute(key, Dictionary[key].Value1,  Dictionary[key].Value2,    Dictionary[key].Value3));
                    }
                    return _attributes;
                }
            return _attributes;
            }               
        }

    }

Code:

 TestObject TestObj = new TestObject();
 TestObj.Dictionary.Add("asdsad", new Attribute { Value1 = 232, Value2 = 12, Value3 = 89 });
 TestObj.Dictionary.Add("sdfer", new Attribute { Value1 = 10, Value2 = 7, Value3 = 857 });
 TestObj.Dictionary.Add("zxcdf", new Attribute { Value1 = 266, Value2 = 85, Value3 = 11 });                           

 TestObj.Str = "Test";            

 XmlWriterSettings settings = new XmlWriterSettings();
 settings.OmitXmlDeclaration = true;
 settings.Indent = true;
 XmlSerializer serializer = new XmlSerializer(typeof(TestObject));

 using (XmlWriter writer = XmlWriter.Create(@"C:\test.xml", settings))
 {              
      XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
      namespaces.Add(string.Empty, string.Empty);

      serializer.Serialize(writer, TestObj, namespaces);                            
 }

 TestObject newob;
 using (TextReader textReader = new StreamReader(@"C:\test.xml"))
 {
      newob = (TestObject)serializer.Deserialize(textReader);
     //repopulate dictionary from Attribute list
      foreach (Attribute atr in newob.Attributes)
      {
          //code
      }
 }

如果问题是“我可以在不编写代码的情况下将序列化列表转换为字典吗”,那么答案是否定的。你现在所做的并没有什么太大的问题。

您可以考虑使用支持 XML 序列化的字典,这样您就不必先将其转换为列表。这是一个:

  public class XmlDictionary<T, V> : Dictionary<T, V>, IXmlSerializable {
    [XmlType("Entry")]
    public struct Entry {
      public Entry(T key, V value) : this() { Key = key; Value = value; }
      [XmlElement("Key")]
      public T Key { get; set; }
      [XmlElement("Value")]
      public V Value { get; set; }
    }

    System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() {
      return null;
    }

    void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) {
      this.Clear();
      var serializer = new XmlSerializer(typeof(List<Entry>));
      reader.Read();
      var list = (List<Entry>)serializer.Deserialize(reader);
      foreach (var entry in list) this.Add(entry.Key, entry.Value);
      reader.ReadEndElement();
    }

    void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) {
      var list = new List<Entry>(this.Count);
      foreach (var entry in this) list.Add(new Entry(entry.Key, entry.Value));
      XmlSerializer serializer = new XmlSerializer(list.GetType());
      serializer.Serialize(writer, list);
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 XmlSerializer 列表反序列化为字典 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • SSRS ReportViewer 与 XML 嵌入数据源相关的问题

    我有 C WPF 应用程序 我想在 ReportViewer 控件中显示 SSRS 报告 本地报告文件中嵌入了 XML 数据源 从 SQL Server Business Intelligence Development Studio 运行
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 使用 Xpath 进行部分匹配

    我正在尝试创建一个搜索功能 允许使用 Xpath 按歌曲标题或流派进行部分匹配 这是我的 XML 文件
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 如何在JAVA中将两个int合并为一个double?

    如果我有 int a 123 int b 456 如何得到 double c 123 456 这个怎么样 int a 123 int b 456 double c Double parseDouble a b
  • 使用具有固定页眉和页脚的 css 可变内容 div 高度

    我在使用 CSS 时遇到了一些问题 正在向这个精彩的社区寻求帮助 我正在尝试构建一个包含以下元素的布局 1 标题区 2 页脚区域 3 左侧窗格 4 内容区 我提出了以下 CSS 但我不认为这是完成我需要的操作的最佳方式 请在下面找到我正在寻
  • 设计时编辑器支持控件集合

    我想向组件添加一个表示控件集合的属性 并有一个集合编辑器 通过它我可以轻松选择属于该集合的控件 VS确实almost我想要的自动使用以下代码 Private controls As New List Of Control
  • PHP 将 Excel 导出到特定路径?

    是否可以将 PHP MySQL Excel 工作表导出到指定路径 例如 U 盘 这是因为我使用 php 作为销售点 我现在想要的只是单击一个按钮 它将从 MySQL 数据库收集记录并将其作为 excel 或 csv 文件导出到 USB 闪存
  • 具有两个 Y 轴的分组箱线图

    我想使用 GGPLOT2 为同一类别制作两个具有不同信息的箱线图 具有两个 Y 轴 如下图所示 我有区域 AM 和 AR 的两个类别信息 旋转速度和角度 并且我想将这两种运动模式组合在根据区域分组的图形中 到目前为止我的代码如下所示 are
  • C#:0 和 1 排列

    我想列出仅包含 0 和 1 的排列 与二进制类似 但允许可变长度 不必等于 8 长度 例如 0 1 00 01 10 11 000 001 010 011 100 101 110 111 一直到满足X的长度为止 如何才能做到这一点 您还可以
  • “git Remote show origin”:为什么所有分支都显示“已跟踪”,即使有些分支没有?

    为什么 git remote show origin 将远程分支列为 已跟踪 即使这些分支没有链接到本地 分支进行拉 推 在这种情况下 跟踪 还有其他含义吗 我认为这就是 跟踪 的全部含义 关于分支跟踪的 git 文档 1 克隆一个具有多个
  • 如何保持 Google Chrome 扩展弹出窗口打开?

    如果我打开扩展程序弹出窗口 那么我会打开另一个窗口或选项卡 如果我返回弹出窗口 则弹出窗口不会保持打开状态 有没有办法强制它使弹出窗口保持打开状态 As a user 您目前无法强制弹出窗口保持打开状态 这是 UI 团队做出的 UI 决定
  • 使 my_average(a, b) 与定义了 f_add 和 d_div 的任何 a 和 b 一起使用。以及内置函数

    简而言之 我想要的是我编写的大多数数学函数 例如 my average a b 与任何a and b其中一个f add and f div已被定义 不过载 和 且不中断my average built in type built in ty
  • 根据组中唯一/不同值的数量创建二进制变量

    我有数据如下 userID lt c 1 1 1 2 2 2 3 3 3 product lt c a a a b b c a b c df lt data frame userID product 对于每个 userID 我想创建一个二进
  • file_get_contents():SSL 操作失败,代码为 1(证书验证失败)

    我已经安装了 WAMP 3 0 4 并尝试编写一个连接到外部 HTTPS Web 服务的 PHP 脚本 但这会返回错误 警告 file get contents SSL 操作失败 代码为 1 OpenSSL 错误消息 错误 14090086
  • .NET 阻塞套接字读取直到 X 字节可用?

    假设我通过 TCP 实现了简单的协议 其中每条消息由以下部分组成 An int表示数据长度 二进制数据 长度在 1 中指定 读这样的消息我想要这样的东西 int length input ReadInt byte data input Re
  • Three.js - 用于碰撞检测的精确光线投射

    我正在使用 Three js 版本68 我使用与此人在这里使用的相同的方法进行碰撞检测 这在大多数情况下都很棒 向作者表示深深的 感谢 http stemkoski github io Three js Collision Detectio
  • Python 3 虚拟环境问题

    我遇到了类似的问题这个帖子 但我已经在运行最新版本的virtualenv我也得到了不同的ImportError 使用 virtualenv 版本 2 7 默认 工作正常 但我需要将 python3 用于另一个项目 我安装它使用brew in
  • 根据对象中键的值对数组中的对象进行分组

    我有以下数据 我想根据日期进行排序 不包括时间戳 NOTE 我可以访问moment为了这个任务 我的数据如下所示 const data fixture AC v Inter kickOffTime 2018 06 14T15 00 00Z
  • 根据分隔符分多列打印文件

    这似乎是一个简单的任务 但是使用 duckduckgo 我无法找到一种方法来正确地完成我想要做的事情 主要问题是 如何使用分隔符将 linux 或 bash 中命令的输出拆分为多列 我有一个如下所示的文件 这只是一个简化的示例 Some d
  • java8中列表的迭代列表[重复]

    这个问题在这里已经有答案了 我想知道 我们如何使用 Java 8 中的流 API 迭代多级列表 例如 List
  • PyQt 自定义小部件未显示

    我是 PyQt 的新手 我试图将 QTableView 放入一个类中 这样我就可以在类中定义它的行为 而无需将其与所有其他代码混合 但是当我这样做时 它就不会显示 这是我正在学习的代码 这是借来的 使用 QAbstractTableMode
  • 如何只读取文本文件的部分内容?

    我有一个 PHP 脚本 可以大量处理大型文本文件 主要是日志文件 问题是大多数时候我只想要它的一部分 从一个分割点到另一个分割点 但必须读取 2GB 文本文件才能获取其中的一小部分 这会减慢该过程 有什么方法可以只读取部分文本 而不必将整个
  • 使用 XmlSerializer 列表反序列化为字典

    我通过将 Dictionary 转换为 List 将数据序列化为 xml 序列化没问题 是否可以在反序列化时填充字典 现在我在反序列化完成并返回列表后填充字典 Serializable public class Attribute publ