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
приписывать.