使用属性 XmlSerialize 自定义集合

2023-12-30

我有一个简单的类,它继承自 Collection 并添加了几个属性。我需要将此类序列化为 XML,但 XMLSerializer 会忽略我的附加属性。

我认为这是因为 XMLSerializer 对 ICollection 和 IEnumerable 对象进行了特殊处理。解决这个问题的最佳方法是什么?

这是一些示例代码:

using System.Collections.ObjectModel;
using System.IO;
using System.Xml.Serialization;

namespace SerialiseCollection
{
    class Program
    {
        static void Main(string[] args)
        {
            var c = new MyCollection();
            c.Add("Hello");
            c.Add("Goodbye");

            var serializer = new XmlSerializer(typeof(MyCollection));
            using (var writer = new StreamWriter("test.xml"))
                serializer.Serialize(writer, c);
        }
    }

    [XmlRoot("MyCollection")]
    public class MyCollection : Collection<string>
    {
        [XmlAttribute()]
        public string MyAttribute { get; set; }

        public MyCollection()
        {
            this.MyAttribute = "SerializeThis";
        }
    }
}

这会输出以下 XML(注意 MyCollection 元素中缺少 MyAttribute):

<?xml version="1.0" encoding="utf-8"?>
<MyCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <string>Hello</string>
    <string>Goodbye</string>
</MyCollection>

What I want is

<MyCollection MyAttribute="SerializeThis" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <string>Hello</string>
    <string>Goodbye</string>
</MyCollection>

有任何想法吗?越简单越好。谢谢。


集合通常不适合存放额外的属性。在序列化和数据绑定期间,如果项目看起来像集合(IList, IEnumerable等 - 取决于场景)。

如果是我,我会封装该集合 - 即

[Serializable]
public class MyCollectionWrapper {
    [XmlAttribute]
    public string SomeProp {get;set;} // custom props etc
    [XmlAttribute]
    public int SomeOtherProp {get;set;} // custom props etc
    public Collection<string> Items {get;set;} // the items
}

另一种选择是实施IXmlSerializable(相当多的工作),但这仍然不适用于数据绑定等。基本上,这不是预期的用法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用属性 XmlSerialize 自定义集合 的相关文章

  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 为什么 Xcode 中“运行 > 使用性能工具运行 > Shark”总是灰色的?怎么称呼呢?

    我的运行菜单中有一个 Shark 条目 但总是不活跃 怎么了 带有 Snow Leopard 的新 xcode 从头开始安装了所有开发人员工具 包括 CHUD Shark 本身运行但看不到任何设备 尽管 xcode 可以看到 它在设备上构建
  • 如果 log4net 附加程序无法写入数据库,如何记录此异常?

    我在应用程序中使用 Log4Net API 来记录任何重要事件或信息 并将异常记录到数据库中 使用Log4Net API时可能会出现异常 如果无法执行登录到数据库的操作 那么该异常将如何存储 如果 Log4Net API 无法执行日志记录
  • 如何快速创建静态类?

    我想创建一个static快速上课 这可能吗 如果是这样怎么办 I tried static class MyClass 但出现错误Declaration cannot be marked static 没有静态类 但您可以通过仅添加静态方法
  • 如何在 Chrome 中设置 DOM 断点

    我正在尝试按照教程进行操作here https developers google com chrome developer tools docs elements 我被困在该部分DOM 断点 靠近底部 I went to the exam
  • WCF JSON POST请求,单个字符串参数未绑定并返回400

    在我的WCF 天蓝色云 服务中 我想支持JSON 我正在创建一些测试方法来查看是否一切正常 我可以让 GET 调用正常工作 但是当我使用简单参数执行 POST 时 我总是会得到 The remote server returned an e
  • 如何从 Access 中的 VBA 编辑器窗口运行查询?

    我想做这样的事情 DoCmd OpenQuery select from some table 我该怎么做 请记住 我不想创建新查询 保存并运行它 我只想在 VBA 代码中键入 select 语句并运行它 如果您只想获得最大值 则DMax
  • jq 通过转换现有的 json 创建一个新的 json

    prodid 876006 serid seridone 3265874 seridtwo 21458915 serials 028915 prodid 980 serid seridone 32743214 seridtwo 546987
  • Android studio - 无法完成 gradle 执行 - 打开 zip 文件时出错

    我是 android 开发和 android studio IDE 的新手 我已经从 bitbucket 签出了一个项目 当我尝试编译它时 出现以下错误 无法完成 Gradle 执行 原因 打开 zip 文件时出错 My gradle wr
  • 从页面 JS 中访问 React 对象?

    我有一个 ReactVr 对象 我用下面的代码渲染它 React 初始化后 我会定期接收服务器更新 我想将其作为 props 传递到 React 中 我该怎么做 React 对象中的 props 可以从我的 普通 JS 设置吗 ReactV
  • 退出无限循环? [复制]

    这个问题在这里已经有答案了 当我输入非整数时 我会进入无限循环 我如何解决它 这是我的代码 def inputInt integer while True try result int integer except ValueError p
  • 将 Java 8 与 LibGDX 结合使用

    我正在使用 LibGDX 用 Ja va 编写一个游戏 仅desktop作为目标平台 我刚刚创建了一个新的 LibGDX 项目 并向其中导入了一些现有代码 但现在出现了一些错误 具体来说 使用diamond operator 例如这行代码
  • 设置 pandas 图的图例位置

    我知道如何设置 matplotlib 图的图例位置plt legend loc lower left 但是 我正在用 pandas 方法进行绘图df plot 并需要将图例位置设置为 左下 有谁知道该怎么做 编辑 我实际上正在寻找一种通过
  • 我们如何在 Ionic App 中实现 SignalR?

    我制作了一个应用程序 可以向已注册该应用程序 Ionic Angular 的用户发送消息 它从数据库 SQL Server C API 获取所有消息并在消息框中打印出来 这很好 但是当我们向正在交谈的人发送消息时 该人在不刷新页面的情况下不
  • 在 Rails 中,如何在 i18n 语言环境文件中指定默认 flash 消息

    我知道 i18n 语言环境文件中有一些预设结构 以便 Rails 自动提取值 例如 如果您想为新记录设置默认提交按钮文本 config locales en yml en helpers submit create Create model
  • MySQL表可以存储的最大记录数是多少?

    MySQL MyISAM 表可以存储多少条记录 InnoDB可以有多少个 您无法按记录数进行计数 因为您的表可能包含只有几个 int 字段的非常短的记录 或者您的记录可能非常长且包含数百个字段 因此必须以表的文件大小来衡量 对于 MYSQL
  • 由不同操作成功触发的 Github Action

    我试图在成功运行不同的操作后触发 Github 操作来运行 这两个工作流程是 单元测试操作 首先运行 并且应该触发下面的 后续测试 操作 name unit tests on push branches jobs build runs on
  • 我正在用 microsoft Visual Studio 做我的 C++ 作业,我注意到一些不寻常的事情 [重复]

    这个问题在这里已经有答案了 当我尝试获取动态数组中插槽的数据时 出现异常 但是如果我使用不同的编译器 例如在线编译器 运行相同的代码 https www onlinegdb com online c compiler https www o
  • 如何绘制 z = f(x, y) 的平滑二维彩色图

    我正在尝试绘制二维现场数据使用 matplotlib 所以基本上我想要类似的东西 在我的实际情况中 我将数据存储在硬盘驱动器上的文件中 然而 为了简单起见 请考虑函数 z f x y 我想要一个平滑的二维图 其中 z 使用颜色可视化 我使用
  • 如何使用 JQuery 和跨站点脚本编写 ajax?

    我遇到一个问题 我必须从这里获取 json http templodasdeusas com br game srv game php srv home http templodasdeusas com br game srv game p
  • 使用属性 XmlSerialize 自定义集合

    我有一个简单的类 它继承自 Collection 并添加了几个属性 我需要将此类序列化为 XML 但 XMLSerializer 会忽略我的附加属性 我认为这是因为 XMLSerializer 对 ICollection 和 IEnumer