【问题标题】:DataContractSerializer Readobject returns null for custom objectDataContractSerializer Readobject 为自定义对象返回 null
【发布时间】: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 的对象位置。

【问题讨论】:

    标签: .net xml asp.net-core asp.net-core-3.1 datacontractserializer


    【解决方案1】:

    使用 XMLSerializer 解决了这个问题

        XmlSerializer xmlSerializer = new XmlSerializer(parameters[i].ParameterType, 
                                      operation.Contract.Namespace);
    
        arguments.Add(xmlSerializer.Deserialize(xmlReader));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多