ServiceStack.Text.XmlSerializer.DeserializeFromString результат изменения, когда я изменяю порядок xmlnode. Зачем?

Что не так с 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; }
}

Попробуйте десериализовать файл третьей стороны следующим образом:

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 ответ

Решение

Как объясняется здесь, сериализатор XML по умолчанию, используемый ServiceStack (сериализатор DataContract.NET), предполагает, что элементы XML должны быть в том же порядке, который объявлен в вашем классе. В терминологии схемы XML элементы объявляются как xs:sequence скорее, чем xs:all, Если вам необходимо поддерживать элементы XML в любом возможном порядке в запросе, вам может потребоваться переопределить сериализатор XML, используемый ServiceStack, как описано в приведенной выше ссылке.

Если вам просто нужно настроить порядок элементов XML, я думаю, что вы можете указать точный порядок для ваших элементов, украсив свои свойства с помощью DataMember атрибуты и указание Order имущество. Если вы сделаете это, то вам также нужно будет украсить свой Location класс с DataContract приписывать.

Другие вопросы по тегам