DataContractSerializer Readobject 为自定义对象返回 null
Posted
技术标签:
【中文标题】DataContractSerializer Readobject 为自定义对象返回 null【英文标题】:DataContractSerializer Readobject returns null for custom object 【发布时间】:2020-11-04 07:59:06 【问题描述】:我正在尝试在 .net CORE 中实现 SOAP 中间件,为了将 XML 检索到 DataContract 对象中,我发现它没有获取服务合同中定义的自定义对象的值。
private object[] GetRequestArguments(Message requestMessage, OperationDescription operation)
var parameters = operation.DispatchMethod.GetParameters();
var arguments = new List<object>();
// Deserialize request wrapper and object
using (var xmlReader = requestMessage.GetReaderAtBodyContents())
// Find the element for the operation's data
xmlReader.ReadStartElement(operation.Name, operation.Contract.Namespace);
for (int i = 0; i < parameters.Length; i++)
var parameterName = parameters[i].GetCustomAttribute<MessageParameterAttribute>()?.Name ?? parameters[i].Name;
xmlReader.MoveToStartElement(parameterName, operation.Contract.Namespace);
if (xmlReader.IsStartElement(parameterName, operation.Contract.Namespace))
var serializer = new DataContractSerializer(parameters[i].ParameterType, parameterName, operation.Contract.Namespace);
arguments.Add(serializer.ReadObject(xmlReader, verifyObjectName: true));
return arguments.ToArray();
当数据合约对象具有简单的数据类型时,上述函数可以正常工作
[OperationContract]
double Add(double x, double y);
以xml作为
<Add xmlns="http://tempuri.org/">
<x>12</x>
<y>10</y>
</Add>
但它不适用于像这样的对象
<TestLocation xmlns="http://tempuri.org/">
<location>
<zip_code>85379</zip_code>
</location>
</TestLocation>
serializer.ReadObject 行返回 zip_code 为 null 而不是 85379 的对象位置。
【问题讨论】:
【参考方案1】:使用 XMLSerializer 解决了这个问题
XmlSerializer xmlSerializer = new XmlSerializer(parameters[i].ParameterType,
operation.Contract.Namespace);
arguments.Add(xmlSerializer.Deserialize(xmlReader));
【讨论】:
以上是关于DataContractSerializer Readobject 为自定义对象返回 null的主要内容,如果未能解决你的问题,请参考以下文章
使用 DataContractSerializer 自定义序列化
DataContractSerializer - 如何将 xml 输出到字符串(而不是文件)
通过 DataContractSerializer 跳过 DataMember
使用 DataContractSerializer 时设置属性的初始值
使用 DataContractSerializer 和 XmlDictionaryWriter 序列化 JObject 后崩溃