2012-11-26 24 views
7

编辑:我问我thougt的尝试一些问题的时刻.. 我设置XML命名空间属性的请求,该诀窍..RestSharp反序列化返回空属性,但xml.deserialize测试工作

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

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

接下来的问题是越来越RestSharp识别XML atributes为对象属性


我在这个周末的大部分时间里都一直在努力,我只是不明白这一点。

我想写一个包装圆RestFul web服务(MusicBrainz)。我正在测试一个简单的例子:获取一位艺术家的细节并将其放入自定义艺术家对象中。

当我做了对RESTClient实现执行它最终确定,但我的对象属性为null .. 但是当我测试反序列化与XmlDeserializer的objectproperties被填充(但不包括对应于一个属性的属性,但我稍后会解决)

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

帮助会非常感激..

Returnded 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> 

我类:

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; 
} 
+1

我找到了我感兴趣的解决方案:-) –

+0

@AndersBornholm。自从我在这个项目上做了一些工作已经很长时间了。但就我的记忆而言,“解决方案”是在RestSharp请求上设置一个名称空间。如果您真的绝望,我可以挖掘该项目并仔细查看... – FasterRaf

+0

我其实并没有在我的项目要么很长一段时间。如果我没有记错,我使用restsharp以外的东西解决了它:-) –

回答

0

这是因为Execute方法,接收响应之后,试图谈判它基于请求的rootElement的与XML命名空间属性和它们复制到XmlDeserializer

这里有一个代码from RestClient

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

如果传递RestRequest有不匹配的XML命名空间,RestSharp的XmlDeserializer(使用的XDocument幕后)将无法响应XML映射到对象的属性和您将获得默认/空值。

现在的默认实现(当手动创建XmlDeserializer),如果你没有设置XML命名空间,解串器会做一个自动检测,基本上忽略了响应的所有命名空间,只有通过他们的名字的所有属性映射。

查看源代码from XmlDeserializer

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

考虑到所有上述因素,很明显,为什么它开始在这一行你的请求对象明确设置后XML命名空间属性工作到匹配的命名空间:

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

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