gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:48:33 27 4
gpt4 key购买 nike

编辑:在我问这个问题的那一刻,我想到了尝试一些事情..我已经根据请求设置了 XmlNamespace 属性,这就成功了..

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

但是我真的不明白为什么...

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


周末的大部分时间我都在研究这个问题,但我就是没有让它发挥作用。

我正在尝试围绕 RestFul 网络服务 (MusicBrainz) 编写包装器。我正在用一个简单的示例进行测试:获取一位艺术家的详细信息并将其放入自定义艺术家对象中。

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

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

帮助将不胜感激..

返回的 xml:

<metadata>
<artist type="Group" id="f1548c5b-329e-4036-921c-02213a04b525">
<name>Uriah Heep</name>
<sort-name>Uriah Heep</sort-name>
<country>GB</country>
<life-span>
<begin>1970</begin>
</life-span>
</artist>
</metadata>

我的类(class):

public class Artist
{
public int Id { get; set; }
public string Type { get; set; }
public string Name { get; set; }
public string SortName { get; set; }
public string Country { get; set; }

}

在下面的代码中填充了输出属性

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

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

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

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

public T Execute<T>(RestRequest request) where T : new()
{
var client = new RestClient();
client.BaseUrl = BaseUrl;
client.Authenticator = null;

//does not fill properties
var response = client.Execute<T>(request);

if (response.ErrorException != null)
{
throw response.ErrorException;
}
var xml = new XmlDeserializer();

//fills properties
var output = xml.Deserialize<Artist>(response);

return response.Data;
}

最佳答案

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

这是一个代码 from RestClient :

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

如果您传递一个 XmlNamespace 不匹配的 RestRequest,RestSharp 的 XmlDeserializer(在幕后使用 XDocument)将无法将响应 XML 映射到对象属性,您将获得默认/空值值代替。

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

查看源代码from XmlDeserializer :

     // autodetect xml namespace
if (!Namespace.HasValue())
{
RemoveNamespace(doc);
}

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

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

Execute 方法将命名空间复制到反序列化器中,并将 XML 适本地映射到对象。

关于c# - RestSharp Deserialize 返回空属性,但 xml.deserialize 测试有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13561373/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com