如何使用 RestSharp 反序列化 class 层次结构?
How do I use RestSharp to deserialize class hierarchies?
HTTP 响应(text/xml):
<results>
<status code="ok"/>
<OWASP_CSRF_TOKEN>
<token>db8288c2e01a6e0caa5a9b52cc4570040b2714cc7a1f589670d6606d486ab98e</token>
</OWASP_CSRF_TOKEN>
</results>
我的 C# 对象:
[DeserializeAs(Name = "results")]
public class Response
{
[DeserializeAs(Name = "status")]
public ResultStatus Status { get; set; }
public struct ResultStatus
{
[DeserializeAs(Name = "code")]
public string Code { get; set; }
}
}
internal class AuthenticationResponse : Response
{
[DeserializeAs(Name = "OWASP_CSRF_TOKEN")]
internal OWaspCsrfToken CsrfToken { get; set; }
internal struct OWaspCsrfToken
{
[DeserializeAs(Name = "token")]
internal string Token { get; set; }
}
}
此处的目标是让 RestSharp 反序列化代码中对对象的 HTTP 响应。但是,由于某种原因,只有结果状态的 Code
属性 被正确设置; Token
属性 总是 null
。在这样的 class 层次结构中反序列化对象的正确方法是什么?
问题出在 internal
的使用上。我的猜测是属性 类 和标记为 internal
的方法甚至无法在运行时使用反射正确嗅探。或者,如果可以的话,RestSharp 可能无法正确执行此操作。无论如何,这有效:
public class AuthenticationResponse : Response
{
[DeserializeAs(Name = "OWASP_CSRF_TOKEN")]
public OWaspCsrfToken CsrfToken { get; set; }
public struct OWaspCsrfToken
{
[DeserializeAs(Name = "token")]
public string Token { get; set; }
}
}
编辑:实际上,我很确定反射可以看到内部方法。问题是 RestSharp 无法在任何内部属性上调用 set 方法。
HTTP 响应(text/xml):
<results>
<status code="ok"/>
<OWASP_CSRF_TOKEN>
<token>db8288c2e01a6e0caa5a9b52cc4570040b2714cc7a1f589670d6606d486ab98e</token>
</OWASP_CSRF_TOKEN>
</results>
我的 C# 对象:
[DeserializeAs(Name = "results")]
public class Response
{
[DeserializeAs(Name = "status")]
public ResultStatus Status { get; set; }
public struct ResultStatus
{
[DeserializeAs(Name = "code")]
public string Code { get; set; }
}
}
internal class AuthenticationResponse : Response
{
[DeserializeAs(Name = "OWASP_CSRF_TOKEN")]
internal OWaspCsrfToken CsrfToken { get; set; }
internal struct OWaspCsrfToken
{
[DeserializeAs(Name = "token")]
internal string Token { get; set; }
}
}
此处的目标是让 RestSharp 反序列化代码中对对象的 HTTP 响应。但是,由于某种原因,只有结果状态的 Code
属性 被正确设置; Token
属性 总是 null
。在这样的 class 层次结构中反序列化对象的正确方法是什么?
问题出在 internal
的使用上。我的猜测是属性 类 和标记为 internal
的方法甚至无法在运行时使用反射正确嗅探。或者,如果可以的话,RestSharp 可能无法正确执行此操作。无论如何,这有效:
public class AuthenticationResponse : Response
{
[DeserializeAs(Name = "OWASP_CSRF_TOKEN")]
public OWaspCsrfToken CsrfToken { get; set; }
public struct OWaspCsrfToken
{
[DeserializeAs(Name = "token")]
public string Token { get; set; }
}
}
编辑:实际上,我很确定反射可以看到内部方法。问题是 RestSharp 无法在任何内部属性上调用 set 方法。