1

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";

如果我只更改顺序,为什么会有如此不同的结果?

4

1 回答 1

2

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

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

于 2013-08-14T13:36:39.743 回答