c# – RestSharp Deserialize返回空属性,但xml.deserialize测试有效

前端之家收集整理的这篇文章主要介绍了c# – RestSharp Deserialize返回空属性,但xml.deserialize测试有效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
编辑:我问这个问题的那一刻我想尝试一下……
我已经在请求上设置了XmlNamespace属性,并且这样做了.
  1. request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#";

但我真的不明白为什么……

下一个问题是让RestSharp将xml属性识别为对象属性

在周末的大部分时间里,我一直在讨论这个问题,而我却没有让它发挥作用.

我正在尝试围绕RestFul webservice(MusicBrainz)编写一个包装器.我正在测试一个简单的例子:获取一位艺术家的详细信息并将其放入自定义的Artist对象中.

当我在RestClient上执行Execute时,它结束了,但我的对象属性为null.
但是当我使用XmlDeserializer测试反序列化时,objectproperties被填充(但不是对应于属性属性,但我稍后会解决)

在响应的反序列化和将对象放在response.data之间会发生什么?
很可能这是我正在制作的“新手”错误,因为这是我使用RestSharp的第一步.

帮助将不胜感激..

退回的xml:

  1. <Metadata>
  2. <artist type="Group" id="f1548c5b-329e-4036-921c-02213a04b525">
  3. <name>Uriah Heep</name>
  4. <sort-name>Uriah Heep</sort-name>
  5. <country>GB</country>
  6. <life-span>
  7. <begin>1970</begin>
  8. </life-span>
  9. </artist>
  10. </Metadata>

我的课 :

  1. public class Artist
  2. {
  3. public int Id { get; set; }
  4. public string Type { get; set; }
  5. public string Name { get; set; }
  6. public string SortName { get; set; }
  7. public string Country { get; set; }
  8.  
  9. }

在以下代码输出属性已填充

  1. var output = xml.Deserialize<Artist>(response);

但是同样的响应在调用时不会填充属性

  1. var response = client.Execute<T>(request);

完整代码(为了简单起见,我将测试代码放在通用方法中):

  1. public T Execute<T>(RestRequest request) where T : new()
  2. {
  3. var client = new RestClient();
  4. client.BaseUrl = BaseUrl;
  5. client.Authenticator = null;
  6.  
  7. //does not fill properties
  8. var response = client.Execute<T>(request);
  9.  
  10. if (response.ErrorException != null)
  11. {
  12. throw response.ErrorException;
  13. }
  14. var xml = new XmlDeserializer();
  15.  
  16. //fills properties
  17. var output = xml.Deserialize<Artist>(response);
  18.  
  19. return response.Data;
  20. }

解决方法

发生这种情况是因为Execute方法在接收到响应后,会尝试根据请求的RootElement和XmlNamespace属性进行协商,并将它们复制到XmlDeserializer中.

这是代码from RestClient

  1. handler.RootElement = request.RootElement;
  2. handler.DateFormat = request.DateFormat;
  3. handler.Namespace = request.XmlNamespace;
  4. response.Data = handler.Deserialize<T>(raw);

如果使用不匹配的XmlNamespace传递RestRequest,则RestSharp的XmlDeserializer(在后台使用XDocument)将无法将响应XML映射到对象属性,您将获得默认值/ null值.

现在对于默认实现(当您手动创建XmlDeserializer时),如果未设置XmlNamespace,则反序列化器将执行自动检测,该检测基本上忽略响应中的所有命名空间,并仅根据其名称映射所有属性.

见源代码from XmlDeserializer

  1. // autodetect xml namespace
  2. if (!Namespace.HasValue())
  3. {
  4. RemoveNamespace(doc);
  5. }

考虑到上述所有因素,很清楚为什么在您使用以下行将XmlNamespace属性显式设置为请求对象中的匹配命名空间后,它开始工作:

  1. request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#";

执行方法名称空间复制到反序列化器中,并将XML映射到对象.

猜你在找的C#相关文章