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
相关产品推荐
相关产品推荐

