当我更改xmlnode的顺序时,ServiceStack.Text.XmlSerializer.DeserializeFromString结果更改。为什么?

时间:2013-08-14 11:24:25

标签: xml-serialization servicestack servicestack-text

ServiceStack.Text.XmlSerializer有什么问题?

我有对象:

public class weatherdata : IReturn<WashService>
{
    public Location location { get; set; }
}
public class Location
{
    public string name { get; set; }
    public string country { get; set; }
}

尝试反序列化第三方xml:

var data = ServiceStack.Text.XmlSerializer.DeserializeFromString<weatherdata>("<weatherdata><location><name>Moscow</name><country>RU</country></location></weatherdata>");

data.location.name =莫斯科。 data.location.country为NULL;

像这样改变xml:

var data = ServiceStack.Text.XmlSerializer.DeserializeFromString<weatherdata>("<weatherdata><location><country>RU</country><name>Moscow</name></location></weatherdata>");

并查看

data.location.name == "Moscow".
data.location.country =="RU";

如果我只改变订单,为什么会有如此不同的结果?

1 个答案:

答案 0 :(得分:2)

作为explained here,ServiceStack(.NET的DataContract序列化程序)使用的默认XML序列化程序假定XML元素的顺序必须与类中声明的顺序相同。在XML模式术语中,元素声明为xs:sequence而不是xs:all。如果您需要在请求中以任何可能的顺序支持XML元素,那么您可能需要覆盖ServiceStack使用的XML序列化程序,如上面的链接所述。

如果您只需要调整XML元素的顺序,我相信您可以通过使用DataMember属性修饰属性并指定Order属性来为元素指定确切的顺序。如果您这样做,那么您还需要使用DataContract属性装饰Location课程。