WCF XML反序列化不填充数组
Posted
技术标签:
【中文标题】WCF XML反序列化不填充数组【英文标题】:WCF XML deserialization not populating array 【发布时间】:2019-12-10 06:57:09 【问题描述】:我使用 VS 2017 Pro (C#) 针对 .Net 4.5.1 开发了一个 WCF 该服务接受 SOAP 请求中的 XML 对象。 我遇到的问题是 XML 中有一个未反序列化的数组。 WCF 正在使用本机反序列化程序。下面的代码和 XML 示例。
XML标签Application->Amount反序列化ok
XML 标记 Application_SAList->Application_SA->SecurityKey> 没有
ApplicationImpl.Application_SAList业务逻辑空检查通过,但ApplicationImpl.Application_SAList.Application_SA数组长度为0
所有类都有'using System.Runtime.Serialization;'
急于解决这个问题!提前感谢任何人的帮助!
IApplicationService.cs
namespace TApplicationService
[ServiceContract(Namespace = "http://xyz")]
public interface IApplicationService
[OperationContract(Name="ProcessApplication")]
string ProcessApplication(ApplicationRequestImpl ApplicationRequestImpl);
ApplicationService.svc.cs
namespace ThriventApplicationService
[ServiceBehavior(Namespace = "http://xyz")]
public class ApplicationService : IApplicationService
private SDatabase gDatabase = null;
public string ProcessApplication(ApplicationRequestImpl ApplicationRequestImpl)
// does a bunch of business logic here
ApplicationRequestImpl.cs
namespace ThriventApplicationService
[DataContract(Namespace = "http://xyz")]
public class ApplicationRequestImpl
[DataMember]
public Application Application;
[DataMember(Name="Application_SAList")]
public ApplicationSASingle Application_SAList;
应用程序.cs
namespace ThriventApplicationService
[DataContract(Namespace = "http://xyz")]
public class Application : IExtensibleDataObject
[DataMember]
public string Amount;
Application_SASingle.cs
namespace ThriventApplicationService
[DataContract(Namespace = "http://xyz")]
public class ApplicationSASingle
[DataMember]
public Application_SA[] Application_SA;
Application_SA.cs
namespace ThriventApplicationService
[DataContract(Namespace = "http://xyz")]
public class Application_SA
[DataMember]
public string Security_Key;
示例 XML
<ProcessApplication xmlns="http://xyz">
<ApplicationRequestImpl>
<Application>
<Amount>50000.0</Amount>
</Application>
<Application_SAList>
<Application_SA>
<Security_Key>1588</Security_Key>
</Application_SA>
</Application_SAList>
</ApplicationRequestImpl>
</ProcessApplication>
ApplicationRequestImpl.cs 中的解决方案
[DataContract(Namespace = "http://prosurv")]
public class ApplicationRequestImpl
[DataMember]
public Application Application;
[DataMember(Name="Application_SAList")]
//public Application_SAList Application_SAList;
public Application_SA[] Application_SA;
【问题讨论】:
【参考方案1】:又一次拍摄后,我找到了解决方案。问题在于ApplicationRequestImpl
类。 XML rerader 正在寻找 Application_SA
内不存在的 Application_SA
元素。
[DataContract(Namespace = "http://xyz")]
public class ApplicationRequestImpl
[DataMember]
public Application Application;
//Remove these two lines
//[DataMember(Name="Application_SAList")]
//public ApplicationSASingle Application_SAList;
[DataMember]
public Application_SA[] Application_SAList;
查看full working solution
数组的问题是它们需要知道它们的大小。其中初始化时为0。等于:
public Application_SA[] Application_SA = new Application_SA[0];
反序列化的对象没有空间容纳。
解决方案是切换到:
public List<Application_SA> Application_SA = new List<Application_SA>();
希望对你有帮助。
【讨论】:
谢谢。我试过这个,但没有区别。我正在使用 .Count 属性检查 Application_SA 列表的出现次数,它返回零。 你能分享工作样本吗?我想深入研究它并提供帮助。 我可能看到了这个问题。给我一分钟,我会更新答案。 所以这发生了......一位同事建议使用此 xml 结构对 Application_SAList 进行测试,并将其反序列化到数组 [] 中。但是我不能告诉客户更改他们的请求 xml。必须是我可以对类做的事情,以使其在没有额外重复标签的情况下工作: 20192100732297250000.0201921007322972以上是关于WCF XML反序列化不填充数组的主要内容,如果未能解决你的问题,请参考以下文章
WCF -Rest- DataContract:反序列化 XML 包装的响应
C# Restful WCF 服务。无法在帖子正文中反序列化 XML