XML 序列化错误 - 类型“ItemsChoiceType[]”的选择标识符“ItemsElementName”值无效或缺失

2023-12-14

我正在尝试序列化要传递给 Web 服务的对象并收到上述错误。我可以在调试时看到该值存在于对象本身中,但它似乎没有发现这一点:

string[] tradeAreas = new string[] {"Area1", "Area2", "Area3", "Area4"};
//RetrieveMarketResultsFor
ItemsChoiceType[] choices = new ItemsChoiceType[] { ItemsChoiceType.area };
MarketResultIdentifier mri = new MarketResultIdentifier
{
    ItemsElementName = choices,
    Items = tradeAreas,
    ItemElementName = ItemChoiceType6.applyingDate,
    Item = DateTime.Today.AddDays(-1)
};

var ser = new XmlSerializer(typeof(MarketResultIdentifier));
using (var stream = new FileStream("mri.xml", FileMode.Create))
    ser.Serialize(stream, mri);

Web 服务生成的代码在上述代码中使用了以下类:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3130.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:openaccess")]
public partial class MarketResultIdentifier : OpenAccessAbstractObject {

    private string[] itemsField;

    private ItemsChoiceType[] itemsElementNameField;

    private object itemField;

    private ItemChoiceType6 itemElementNameField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("area", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("areaNames", typeof(string))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
    public string[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")]
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemsChoiceType[] ItemsElementName {
        get {
            return this.itemsElementNameField;
        }
        set {
            this.itemsElementNameField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("applyingDate", typeof(System.DateTime), DataType="date")]
    [System.Xml.Serialization.XmlElementAttribute("auctionIdentification", typeof(AuctionIdentification))]
    [System.Xml.Serialization.XmlElementAttribute("deliveryDay", typeof(System.DateTime), DataType="date")]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
    public object Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemChoiceType6 ItemElementName {
        get {
            return this.itemElementNameField;
        }
        set {
            this.itemElementNameField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3130.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:openaccess", IncludeInSchema=false)]
public enum ItemsChoiceType {

    /// <remarks/>
    area,

    /// <remarks/>
    areaNames,
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3130.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:openaccess", IncludeInSchema=false)]
public enum ItemChoiceType6 {

    /// <remarks/>
    applyingDate,

    /// <remarks/>
    auctionIdentification,

    /// <remarks/>
    deliveryDay,
}

尝试 ser.serialize 时它失败了......

任何帮助表示赞赏:)

Solution原来这只是我愚蠢造成的!感谢@dbc 指出了这一点。我的 tradeAreas 数组有 4 个项目(我在这里使用了错误的数组),但它应该只有一个!


当你使用XmlChoiceIdentifierAttribute反序列化一个序列choice元素转换为某种共享数据类型(这里,string),你需要添加two数组到您的数据模型:

  1. 返回适当类型的对象数组的属性以捕获选择元素contents,这里是四个字符串值tradeAreas array.

    第一个数组必须标记为[XmlChoiceIdentifier(name)] where name是第二个数组的名称,以及[XmlElement(elementName)]每个可能的选择元素名称的属性。

  2. 以及返回枚举数组的属性来捕获选择元素names, here <area>对于每个元素。

    该数组必须标记为[XmlIgnore].

最后,由于第二个数组捕获第一个数组中元素内容的元素名称,数组必须一一对应. Thus choices必须初始化为相同的长度tradeAreas,例如如下:

var tradeAreas = new string[] {"Area1", "Area2", "Area3", "Area4"};
var choices = Enumerable.Repeat(ItemsChoiceType.area, tradeAreas.Length).ToArray();

在您的示例代码中tradeAreas有四个条目choices只有一个,导致您看到的异常。

工作示例 .Net fiddlehere.

有关绑定到 XML 选择元素的文档,请使用XmlSerializer, see 选择元素绑定支持:按名称区分XmlChoiceIdentifierAttribute 类: 备注。有关简单的手动示例,请参见这个答案 to 如何在 C# 中序列化 List 属性而不在 XML 序列化中显示其类型.

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

XML 序列化错误 - 类型“ItemsChoiceType[]”的选择标识符“ItemsElementName”值无效或缺失 的相关文章

随机推荐

  • 去除空格/制表符/换行符 - python

    我正在尝试删除 Linux 上 python 2 7 中的所有空格 制表符 换行符 我写了这个 应该可以完成这项工作 myString I want to Remove all white t spaces new lines n and
  • 尝试对 Django 应用进行 dockerize,Docker 找不到 ft2build.h

    我是 Docker 新手 我正在尝试对 Django 应用程序进行 dockerize 但是当我运行时docker build t sometag 我收到以下错误 9 23 05 Preparing metadata setup py st
  • 接收离线消息mqtt

    我使用 mosquitto 作为代理 使用 paho python 作为客户端 我正在尝试让订阅者接收离线消息 为此我做了以下更改 固定客户端 ID 服务质量级别 2 但是 订阅者仍然无法接收消息 有什么帮助吗 谢谢 拉胡尔 为了让您的客户
  • R 中的分层对数秩检验用于计算流程表单数据?

    背景 在 4 年的半年随访时间中 患者可能会切换到不同的药物组 为了解决这个问题 我将生存数据转换为计数过程形式 我想比较药物组 A B 和 C 的生存曲线 我正在使用扩展的 Cox 模型 但想要对每个风险函数进行成对比较或进行分层对数秩检
  • 在 R 中为 xml2::xml_text() 设置 XML_PARSE_HUGE 选项

    我读过这个问题在 R 中解析 XML 文件 gt 1 MB 这个答案似乎只适用于原来的XMLR 中的包 如何设置此选项xml2 这是我正在运行的代码 library xml2 library magrittr rawXML lt read
  • 我需要为特定的用户代理编写一个网络爬虫

    我需要编写一个网络爬虫 并且希望能够使用已知的用户代理进行爬网 例如 我希望我的爬虫充当iphone来爬取某个网站的移动站点 然后使用Mozilla PC代理再次爬取 等等 这样 我就能够抓取每种 类型 的网站 移动和 PC 但是 我还希望
  • C#中有“之间”函数吗?

    谷歌不明白 Between 是我正在寻找的函数的名称 并且没有返回任何相关内容 例如 我想仅通过一次操作检查 5 是否在 0 到 10 之间 目前尚不清楚 一次操作 是什么意思 但是不 我知道没有运算符 框架方法来确定某个项目是否在范围内
  • equals 方法适用于对象吗?如果是这样,怎么办?

    我有一个动物园程序 动物园里有爬行动物的分支动物亚群 当我执行 equals 方法时 主程序将编译并运行 我很困惑 如果我比较对象而不是专门比较 int 或 String java 如何知道使用 equals 方法 public class
  • 在Android中启动Activity清除顶部

    我的堆栈中有以下活动 A B C D 我想重新启动 B 以获得此堆栈 A B 其中 B 是一个新的 B 实例 不是接收 onNewIntent 回调的旧实例 我该怎么做 顺便说一句 我正在使用 intent setFlags Intent
  • 某些项目无法导入,因为它们已存在于 Eclipse 中的工作区错误

    我正在尝试导入我和我的同事一直在处理的项目 并在选择 导入 然后 导入现有项目 然后单击存档文件 然后单击下一步后不断收到此错误 出现这个错误 有些项目无法导入 因为它们已经存在于 工作区 取消选中 将项目复制到工作区 复选框 然后单击 刷
  • PresentModalViewController:animated 上的不同转换:

    我提出了一个模态视图控制器 它是一个标签栏控制器 里面有一个导航控制器 问题是我的第一个视图有黑色背景 我希望新视图有白色背景 这意味着我要么必须拥有具有透明背景的模态视图控制器 直到其显示白色背景时完成 向上滑动 动画 要么我必须将导航控
  • C# 中#region 和#endregion 有什么用?

    给我一个例子 如果我使用或不使用这个块 我可以实现什么目标 起始区域后面的名称有什么用 region MyClass definition Some code endregion 没有 技术 理由使用 Region 它唯一做的就是提供一种折
  • Java SGML 到 XML 的转换?

    有谁知道将 SGML 转换为 XML 的方法或库 编辑 为了澄清 我必须在 Java 中进行转换 并且我不能使用 SP 解析器或相关的 SX 工具 似乎普遍的共识是 没有现有的库可以在 Java 中执行 SGML 工作 当然 经过几天毫无结
  • 为什么我们不能在 setTimeout 上调用并应用?

    为什么我们不能调用并应用 setTimeout var obj window setTimeout call obj callback delay it throws error stating illegal invocation 使用起
  • 致命:此操作必须在工作树中运行[重复]

    这个问题在这里已经有答案了 当我尝试更改分支时出现此错误 也许我会在以下位置提供一些命令信息 path to git repo 根据命令 git branch 我得到以下输出 V1 5 V2 0 master 当我尝试命令时 git che
  • PHP自动下载文件而不提示保存或打开文件

    我有一个函数 用于从非公共目录下载文件 下载部分工作正常 只是它之前没有提示用户并允许用户选择位置或只是简单的打开 我使用以下代码 file L APP BILAGOR GET f finfo new finfo FILEINFO MIME
  • 如何从命令行覆盖 `project.build.finalName` Maven 属性?

    我有以下由 Maven 3 0 4 运行的普通 pom
  • 当使用 JSch 通过 Java 执行时,即使启用了 setPty,某些 Unix 命令也会失败并显示“...未找到”

    我正在创建一个 Android 应用程序 它将命令发送到设备上的 Linux 终端 使用 ls 命令时我能够获得正确的输出 但是当我使用 ifconfig 或 iwconfig 时设备不会给我任何输出 使用 Tera Term 我已经验证这
  • LINQ:动态选择

    考虑我们有这个类 public class Data public string Field1 get set public string Field2 get set public string Field3 get set public
  • XML 序列化错误 - 类型“ItemsChoiceType[]”的选择标识符“ItemsElementName”值无效或缺失

    我正在尝试序列化要传递给 Web 服务的对象并收到上述错误 我可以在调试时看到该值存在于对象本身中 但它似乎没有发现这一点 string tradeAreas new string Area1 Area2 Area3 Area4 Retri