将 KeyValuePair 列表序列化为 XML

2023-12-05

我正在尝试将对象序列化为 XML。下面是我需要的 XML 格式。

<parameters>
  <parameter>
    <key>Key1</key>
    <value>Value1</value>
    <key>Key2</key>
    <value>Value2</value>
    <key>Key3</key>
    <value>value3</value>
  </parameter>
</parameters>

下面是我创建的模型

[Serializable]
[XmlType("parameters")]
public class parameters
{
    public List<parameter<string,string>> parameter { get; set; }
}

[Serializable]
[XmlType("parameter")]
public class parameter<K,V>
{
    public K key { get; set; }
    public V value { get; set; }

    public parameter() { }

    public parameter(K key, V value)
    {
        this.key = key;
        this.value = value;
    }
}

当我尝试序列化为 XML 时,我得到以下格式

<parameters>
  <parameter>
    <parameter>
      <key>Key1</key>
      <value>Value1</value>
    </parameter>
    <parameter>
      <key>Key2</key>
      <value>Value2</value>
    </parameter>
    <parameter>
      <key>Key3</key>
      <value>Value3</value>
    </parameter>
  </parameter>
</parameters>

请帮我解决这个问题。


从以下角度来看XmlSerializer, the <parameter>XML 的元素不是键/值对类的列表,因为在某些包含元素中没有每对的嵌套。相反,它是一个多态列表,其中每个条目可以是类型的元素<key>或类型<value>。因此,处理此问题的最简单方法可能是使用序列化器的内置功能来处理多态类型列表,如下所示:

public abstract class ParameterKeyOrValue<T>
{
    [XmlText]
    public T Text { get; set; }
}

public sealed class ParameterKey<T> : ParameterKeyOrValue<T>
{
}

public sealed class ParameterValue<T> : ParameterKeyOrValue<T>
{
}

[Serializable]
[XmlType("parameters")]
public class parameters
{
    [XmlIgnore]
    public List<parameter<string, string>> parameter { get; set; }

    [XmlArray("parameter")]
    [XmlArrayItem("key", typeof(ParameterKey<string>))]
    [XmlArrayItem("value", typeof(ParameterValue<string>))]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
    public ParameterKeyOrValue<string>[] XmlParameters
    {
        get
        {
            if (parameter == null)
                return null;
            return parameter.SelectMany(p => new ParameterKeyOrValue<string>[] { new ParameterKey<string> { Text = p.key }, new ParameterValue<string> { Text = p.value } }).ToArray();
        }
        set
        {
            if (value == null)
                parameter = null;
            else
            {
                if (value.Length % 2 != 0)
                    throw new ArgumentException("Unequal number of keys and values");
                var newParameters = value.OfType<ParameterKey<string>>().Zip(value.OfType<ParameterValue<string>>(), (k, v) => new parameter<string, string>(k.Text, v.Text)).ToList();
                // Make sure we got an equal number of keys and values.
                if (newParameters.Count != value.Length / 2)
                    throw new ArgumentException("Unequal number of keys and values");
                parameter = newParameters;
            }
        }
    }
}

The [XmlArrayItem("someTypeName", typeof(SomeType))]装饰告诉序列化器该类型的数组元素SomeType(在这种情况下ParameterKey<string> and ParameterValue<string>) 将使用元素名称进行序列化"someTypeName" ("key" and "value", 分别。)

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

将 KeyValuePair 列表序列化为 XML 的相关文章

  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • MySqlConnectionStringBuilder - 使用证书连接

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

随机推荐

  • 当使用包含 ~、波形符的路径时,file_exists() 返回 false

    所以我有以下路径 my user path to dir 当我将它传递给file exists 效果很好 但是 当我将其更改为 username path to dir 它返回 false realpath username path to
  • 在 Ms 图控件中使用对数刻度

    我试图创建一个图表 其 x 轴以 10 为底的对数刻度 范围从 1 到 1000 我似乎能够在设计时创建该轴 但每当加载表单时 我都会收到一条错误消息 图表面积轴 该轴不能使用对数刻度 这是 MSChart 控件的限制吗 为什么我无法在 X
  • SurfaceView的截屏

    在上图中我有一个SurfaceView和一个Button named Capture SurfaceView正在显示相机预览 所以 我想要截图surfaceview当我点击Capture按钮 我尝试了很多例子和答案 但没有一个有效 我刚刚得
  • 是否可以在 EntityFramework 中将 Select(l=> new{}) 与 SelectMany 一起使用

    我正在尝试一些我不太确定的事情 但我想在这里问是否可能 能做到吗 public IQueryable
  • 查找两个日期之间的精确差异

    我想要对日期比较进行一些更改 在我的应用程序中 我比较两个日期并获取天数差异 但如果只有一天差异 系统会显示 0 作为天数差异 NSDateFormatter date formater NSDateFormatter alloc init
  • C#:如何将对象列表转换为该对象的单个属性的列表?

    假设我有 IList
  • 使用 jQuery 导入 HTML 文件

    我正在尝试使用 jQuery 导入 HTML 文件 section1 load section1 html 问题是当代码加载时 jQuery 不能很好地工作 在这个 HTML 中 我有一些 jQuery UI 和一些复选框 如果我不使用 加
  • 如何向空 numpy 数组添加新行

    使用标准 Python 数组 我可以执行以下操作 arr arr append 1 2 3 arr append 4 5 6 arr is now 1 2 3 4 5 6 但是 我不能在 numpy 中做同样的事情 例如 arr np ar
  • 使用 utf-8 文件名的纯 ASP 上传

    我已经用经典 asp 制作了一个上传页面 只要文件名不是 utf 8 字符 它就可以正常工作 我已添加字符集直到页面 并且表单接受 utf 8 字符 但我的文件保存为 pdf错误应该是 pdf 我不知道是否还有什么可以做的 或者是 纯ASP
  • centos 6.x 上的 pdo dblib

    我正在尝试在 CentOS 版本 6 5 最终版 64 位上安装 dblib centos 6 没有 freetds 所以我必须从其他地方获取 freetds freetds devel 0 91 2 1 x86 64 rpm 使用 pec
  • ASP.NET _ViewStart.cshtml - 获取请求

    我有一个 ASP NET 应用程序 我的应用程序有一个 ViewStart cshtml 文件 该文件如下所示 using MyCompany MyApp Layout Views Shared Layout cshtml var p Ht
  • 在 ViewModel 之间共享状态

    我有两个 ViewModel 它们向不同的视图呈现相同的模型 将模型呈现为一个项目ListBox 另一个将其呈现为选项卡中的选项卡TabControl The TabControl是显示在中选择的项目的选项卡ListBox 以便选项卡随着选
  • 如何以最快的方式做到这一点?

    我需要找出一个单词在字符串中出现了多少次 但问题是您需要查找的单词之间可以有空格 例如您想查看单词出现了多少次text出现在 tOeOxOt 中 它会给你输出 1 或者例如在textt它会给你输出 2 我为此用 pascal 编写了这个过程
  • ios writeToFile 更改不保存

    ios 声称文件已被写入 但更改从未真正保存 就好像它们保留在缓冲区中一样 我需要冲洗吗 void viewDidLoad super viewDidLoad NSString myFilePath NSBundle mainBundle
  • 如何从日期中减去5分钟

    我有这个数据 date Y m d 00 00 00 那个返回2015 10 08 00 00 00 我想取消 5 分钟 2015 10 07 23 55 00 非常感谢 您需要从已知时间点减去 5 分钟 date d 00 00 00 t
  • 如何避免 dcast() 输出中出现 NA 列?

    我怎么能够avoid NA中的列dcast 输出从reshape2包裹 在这个虚拟示例中dcast 输出将包括一个NA柱子 require reshape2 data iris iris Species2 lt iris Species i
  • Kudu npm 安装失败

    当尝试在 Azure 上使用 kudu 部署我的项目时 我遇到了一个非常奇怪的错误 我已经使用 VueJs 使用 dotnet 构建了我的项目 我使用了以下模板 https github com MarkPieszak aspnetcore
  • 是否可以去掉 Service 类中的 TClient 泛型类型

    对于 WCF 客户 我有一个IServiceProxyFactory设置凭据的界面 public interface IServiceProxyFactory
  • 如何模拟或将带有扫描仪输入的控制台引入 jFrame 应用程序

    我想将控制台引入 jFrame 窗口应用程序 并能够与扫描仪输入进行交互 基本上 无论控制台中发生什么 我都希望将其显示在应用程序窗口的文本区域中 有一个简单的解决方案吗 这是我非常简单的代码 控制台逻辑类 import java util
  • 将 KeyValuePair 列表序列化为 XML

    我正在尝试将对象序列化为 XML 下面是我需要的 XML 格式