You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SalesForce XML响应反序列化报错:相同xsi:type类型未识别

解决方案:Salesforce XML响应反序列化处理QueryResult类型问题

问题核心

XML响应中<result>和<LP_QuoteInformation__r>节点均带有xsi:type="QueryResult"属性,默认XmlSerializer无法自动识别这种带类型标识的嵌套结构,导致类型识别异常;修改命名空间后虽无报错,但因模型配置不匹配,无法完成正确反序列化。

具体解决步骤

1. 修正模型类的XML序列化特性

为嵌套的QueryResult节点配置正确的命名空间与类型包含特性,确保模型结构完全匹配Salesforce响应格式:

using System.Collections.Generic;
using System.Xml.Serialization;

// 根响应模型,严格匹配Salesforce命名空间
[XmlRoot(Namespace = "urn:partner.soap.sforce.com")]
public class QueryResponse
{
    [XmlElement("result", Namespace = "urn:partner.soap.sforce.com")]
    [XmlInclude(typeof(QueryResult))]
    public QueryResult Result { get; set; }
}

// 对应Salesforce的QueryResult类型,指定XmlType与命名空间
[XmlType(TypeName = "QueryResult", Namespace = "urn:partner.soap.sforce.com")]
public class QueryResult
{
    [XmlElement("records")]
    public List<SObjectRecord> Records { get; set; }

    [XmlElement("done")]
    public bool Done { get; set; }

    [XmlElement("totalSize")]
    public int TotalSize { get; set; }
}

// 业务对象模型,包含嵌套的LP_QuoteInformation__r QueryResult
public class SObjectRecord
{
    // 其他业务字段示例
    [XmlElement("Id", Namespace = "urn:partner.soap.sforce.com")]
    public string Id { get; set; }

    [XmlElement("LP_QuoteInformation__r", Namespace = "urn:partner.soap.sforce.com")]
    [XmlInclude(typeof(QueryResult))]
    public QueryResult LPQuoteInformation { get; set; }
}

2. 显式配置XmlSerializer的已知类型

创建序列化器时,必须传入QueryResult作为已知类型,确保序列化器能识别xsi:type标记的类型:

var serializer = new XmlSerializer(typeof(QueryResponse), new[] { typeof(QueryResult) });

using (var reader = new StringReader(xmlResponseContent))
{
    var response = (QueryResponse)serializer.Deserialize(reader);
    // 此时response.Result.Records及嵌套的LPQuoteInformation均可正常访问
}

3. 适配单个对象的特殊场景

如果<LP_QuoteInformation__r>返回的是单个对象而非集合,需调整QueryResult的结构:

// 针对单个对象的QueryResult子类
public class SingleRecordQueryResult : QueryResult
{
    [XmlElement("records")]
    public QuoteInformationRecord SingleRecord { get; set; }
}

// 在SObjectRecord中替换引用
[XmlElement("LP_QuoteInformation__r", Namespace = "urn:partner.soap.sforce.com")]
[XmlInclude(typeof(SingleRecordQueryResult))]
public SingleRecordQueryResult LPQuoteInformation { get; set; }

关键注意事项

  • 所有XML特性的Namespace必须严格匹配响应中的urn:partner.soap.sforce.com,不能遗漏或拼写错误。
  • [XmlInclude]特性是核心:必须显式声明序列化器需要识别的多态类型,否则无法解析xsi:type标记。
  • 若涉及分页结果,可通过QueryResult.Done字段判断是否需要继续查询下一页,此逻辑与反序列化独立。

内容的提问来源于stack exchange,提问作者Yuri Podhorodeski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:48:27