如何修复 Visual Studio 生成的 Web 引用代理来处理锯齿状数组?

2024-02-17

Visual Studio 用于生成 Web 服务代理的工具 wsdl.exe 中似乎存在一个已知错误。对于某些 XSD 架构,该工具将生成无法从 XML 反序列化的类。

就我而言,这是不可接受的,但我不知道如何解决它。

我将详细描述我的情况,希望有人能够帮助我。

Schema

<!-- return type from the service operation -->
<xs:complexType name="listAssetsQueryResults">
    <xs:sequence>
        <xs:element name="assets" type="tns:asset" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

<!-- a sequence of attributes -->
<xs:complexType name="asset">
    <xs:sequence>
        <xs:element name="attributes" type="tns:multiValuedAttribute" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="multiValuedAttribute">
    <!-- not relevant-->
</xs:complexType>

来自 Web 服务的 XML 响应

根据此模式的典型响应如下所示:

<assets-query-result>
    <assets>
        <attributes>
            <name>Keywords</name>
            <values>Desert</values>
        </attributes>
        <attributes>
            <name>Filename</name>
            <values>Desert.jpg</values>
        </attributes>
    </assets>
    <assets>...</assets>
    <assets>...</assets>
</assets-query-result>

在代码中使用类型

我本来希望能够使用这样的 CLR 类型:

result.assets[0].attributes[0].name

相反,生成的结果类型如下所示:

[SerializableAttribute()]
public partial class listAssetsQueryResults {
    private multiValuedAttribute[][] assetsField;

    [XmlArrayAttribute(Form=XmlSchemaForm.Unqualified, IsNullable=true)]
    [XmlArrayItemAttribute("attributes", typeof(multiValuedAttribute), Form=XmlSchemaForm.Unqualified)]
    public multiValuedAttribute[][] assets {
        get { return this.assetsField; }
        set { this.assetsField = value; }
    }
}

这甚至不允许生成序列化程序集!

无法转换类型 Portfolio.WebService.multiValuedAttribute 到 Portfolio.WebService.multiValuedAttribute[]

修复它

1 - 更改属性和字段的类型

现在,我在网上找到的修复方法之一就是从生成的属性类型中删除一对括号:

// No longer a jagged array, but this doesn't deserialize all data
public multiValuedAttribute[] assets;

这允许构建序列化程序集,并且它运行时没有异常,除了它没有正确序列化数据,它“跳过”资产列表并反序列化第一个资产的属性assets元素。所以这根本不是修复,因为通过此修复我无法使用数据。对于 700 多种资产,它提供result.assets等于multiValuedAttribute[2](这两个元素是第一个资产的名称和关键字属性)。

2 - 指定 XML 元素的类型

我尝试的第二件事是给解串器不同的指令:

[XmlArrayItemAttribute("attributes", typeof(multiValuedAttribute[]), Form=XmlSchemaForm.Unqualified)]
public multiValuedAttribute[][] assets { ... }

所以现在我告诉它序列中的每个元素都是类型multiValuedAttribute[]。这是错误的,因为它仍在寻找attributes元素,其类型为multiValuedAttribute(单个,不是数组)。然而它确实运行了,但现在result.assets等于multiValuedAttribute[2][0]我仍然无法获取数据。

下一步是什么?

我不知道,这就是我写这篇文章的原因。我无法接受 .NET 无法使用此 Web 服务,因为它必须这样做。


我认为您应该定义一个单独的 Asset 类,该类具有 multiValued Attribute[] 类型的属性。所以它会像这样

public class Asset
{
   public multiValuedAttribute[] attributes {get; set;}
}

public partial class listAssetsQueryResults {
    private Asset[] assetsField;

    public Asset[] assets {

然后,您需要使用 XmlElement/XmlArrayElement/XmlArrayItemElement 属性的某种组合来装饰资产类型、属性和资产属性,以使其正常工作。

不用说,每当您需要重新生成代理代码时,您都必须重新应用上述更改(也许您可以为此创建一个批处理脚本作为构建操作)。

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

如何修复 Visual Studio 生成的 Web 引用代理来处理锯齿状数组? 的相关文章

随机推荐

  • 在 Razor 中使用一个提交按钮提交两个 HTML 表单

    首先 我很抱歉我的英语不好 我是 ASP NET MVC 的新手 目前我正在用它做小型 租车 项目 我想制作一个表单 页面管理员可以在页面上添加汽车 其中包含详细信息 例如name year of production and pictur
  • Java 中的列表、队列和集合

    列表 队列和集合有什么区别 简单来说 A list是对象的有序列表 其中同一对象很可能出现多次 例如 1 7 1 3 1 1 1 5 谈论列表中的 第三个元素 是有意义的 您可以在列表中的任意位置添加元素 更改列表中的任意位置的元素或从列表
  • 在 MATLAB 中保存的 MPEG4 质量

    我需要从加载到 matlab 并编辑 逐帧 的原始 mpeg4 视频中获取 mpeg4 文件以在另一个应用程序中使用 为此 我尝试使用 VideoWriter 将质量设置为 100 newVid VideoWriter outputfile
  • 是什么原因导致 VoiceOver 宣布空组?

    我们有以下 简化的 HTML 真正的 HTML 有点复杂 但是listitem元素是exactly如下面的代码片段所示 div div Foo div div Bar div div Baz div div 当用户向下浏览列表时 Voice
  • 如何在 Swift 中的 UITableViewCell 上添加带有单击事件的按钮?

    在我的主页中 我为 UITableViewCell 创建了一个 xib 文件 我正在从该 xib 文件加载单元格 并且它工作正常 单元格内部有一些标签和按钮 我的目标是通过单击单元格上的按钮来更改标签 我的代码喜欢下面 import UIK
  • android studio 的最低硬件要求?

    我的系统配置 Intel Pentiunm 双核 1 3GHz 2GB RAM 我已经安装了 Android Studio 但它很慢 我是 Android 开发的新手 将 RAM 升级到 4GB 有帮助吗 我有一台具有以下配置的笔记本电脑
  • 是否存在逆向“成员”?红宝石中的方法?

    我经常发现自己在检查某个值是否属于某个集合 据我了解 人们通常使用Enumerable member 为了这 end index member word 1 3 2 然而 这感觉比 Ruby 中的大多数东西不太优雅 我宁愿把这段代码写成 e
  • 由于“CALayer 边界包含 NaN:[nan 0; nan 15.1]”而发生崩溃

    我遇到以下崩溃 CALayerInvalidGeometry CALayerInvalidGeometry CALayer bounds contains NaN nan 0 nan 15 1 这段代码的最后一行 CGRect bounds
  • 使用 numpy 进行元素“in”的 Pythonic 且有效的方法

    我正在寻找一种有效获取布尔数组的方法 其中给定两个大小相等的数组a and b 如果对应的元素为真 则每个元素为真a出现in的对应元素b 例如 以下程序 a numpy array 1 2 3 4 b numpy array 1 2 13
  • ESB MULE 将参数传递给 java 方法

    我使用MULE版本3 3 0 CE 我想从入站标头获取一些值 然后将其传递给java方法 在java方法中对传递的值进行一些更改 最后我再次将其从java方法传递到出站 而不是将 Java bean 绑定到 Mule API 使用Calla
  • 使用 HornetQ 强制消息顺序

    我已经设置了一个 jms 服务器 其中 HornetQ 作为 JMS 提供者 队列 我有一个应用程序充当生产者 另一个应用程序 不同的计算机 充当消费者 我知道 JMS 规范不保证传递的顺序 但我正在寻找一种方法来做到这一点 接收消息exa
  • 如何使用 Python 函数将多个值添加到键中

    class my dict dict init function def init self self dict Function to add key value def add self key value self key value
  • Java 的算术精度更高

    我正在用 Java 构建一个 Web 应用程序 它可以进行数学运算并向用户显示步骤 当使用小数进行基本算术时 我经常会得到准确输出的混乱结果 这是我的问题 double a 0 15 double b 0 01 System out pri
  • 了解 C++ 成员函数模板特化

    我有以下课程 pragma once include
  • 快速访问照片库

    我想在我的应用程序中访问用户照片库中的照片 并且我正在查看 UIImagePickerController 来执行此操作 但是 我想知道是否可以访问和查看照片库中的照片而不实际将这些照片存储在应用程序中 因此基本上该应用程序将存储对所选照片
  • 为什么浏览器会针对不受信任的 SSL 证书显示难看的错误?

    当面对不受信任的证书时 我所知道的每个浏览器都会显示如下的严重错误 Why就是它 这极大地阻碍了 Web 开发人员使用 SSL 这样出色的技术 因为他们担心用户会发现该网站非常可疑 非法 即网络钓鱼 站点在 HTTP 上运行良好 因此不必担
  • 防止 HashMap/HashTable 中出现重复的 对的 Java 代码

    我有一个 HashMap 如下 假设它有 10 0000 个元素 HashMap
  • XDocument 之上的 ViewModel

    我正在开发一个 WPF 应用程序 它有一个表示 XML 的树视图 我将 XML 加载到 XDocument 然后将 TreeView 绑定到该对象 现在使用MVVM模式 http blogs msdn com johngossman arc
  • HTML5视频,如何检测没有音轨?

    我正在制作一个 chrome 应用程序 我希望有用于视频播放的自定义控件 但我在使用静音按钮时遇到了一些困难 应用程序中播放的大多数视频都是无声的 因此我希望能够在没有音轨时禁用该按钮 就像 Chrome 的默认控件一样 尝试使用音量值 但
  • 如何修复 Visual Studio 生成的 Web 引用代理来处理锯齿状数组?

    Visual Studio 用于生成 Web 服务代理的工具 wsdl exe 中似乎存在一个已知错误 对于某些 XSD 架构 该工具将生成无法从 XML 反序列化的类 就我而言 这是不可接受的 但我不知道如何解决它 我将详细描述我的情况