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 后崩溃

在原语列表上使用 DataContractSerializer 的自定义元素名称