使用RestSharp反序列化对象,其中类属于类型属性

时间:2015-10-19 19:48:06

标签: c# xml rest deserialization restsharp

我试图从rest api中使用数据。 我需要使用RestSharp从rest API反序列化对象。 列表中的所有对象都是"对象"对象的类是"类型"的值的元素。属性。

这是我的意思的一个例子:

<list>
    <object type="cat">
        <id>107</id>
        <name>Garry</name>
    </object>
    <object type="dog">
        <id>83</id>
        <name>Fluffy</name>
    </object>
</list>

部分实现的示例类:

public class Animal
{
    public long Id { get; set; }
    public string Name { get; set; }
}

[DeserializeAs(Name = "cat")]
public class Cat : Animal
{
}

[DeserializeAs(Name = "dog")]
public class Dog : Animal
{
}

这似乎是错误的方法,但尝试使用属性定义我的所有类:

[DeserializeAs(Name = "object")]

这允许它们正确地反序列化,只要我知道列表中期望的对象类型,并且显然列表只包含一种类型的对象。

如果我得到一个包含不同类型对象的列表,就会出现问题。

使用标准解串器有没有办法处理好这个问题? 如果没有,我愿意采用大量不同对象类型来有效地处理这个问题。

1 个答案:

答案 0 :(得分:0)

我看了标准的反序列化器。我很确定它不是为处理这个而设计的。我最终制作了自己的叉子。

我添加了另一个用于描述列表中对象的属性:

[DeserializeElementAs(Name = "", Attribute = "", Value = "")]

属性名称可能不是最好的,但我不知道该怎么称呼它。

因此问题中xml的类将被定义为:

public class Animal
{
    public long Id { get; set; }
    public string Name { get; set; }
}

[DeserializeElementAs(Name = "object", Attribute = "type", Value = "cat")]
[DeserializeAs(Name = "cat")]
public class Cat : Animal
{
}

[DeserializeElementAs(Name = "object", Attribute = "type", Value = "dog")]
[DeserializeAs(Name = "dog")]
public class Dog : Animal
{
}

如果有其他人需要,我将fork的代码发布到github。

https://github.com/comless/RestSharp/commit/1fea0fd97cadc7035dbea99c17b7423ca14b5267