Десериализация XML не работает для одного поля - PullRequest
1 голос
/ 25 февраля 2012

Я пытаюсь десериализовать поток XML в объект.Он отлично работает для всех, кроме одного поля, и я не могу понять, что не так с этим полем.Чтобы убедиться, что я знаю, с чем имею дело, я непосредственно закодировал строку XML.

[DataContract(Name = "auth")]
public class Authorization
{
    [DataMember(Name = "status")]
    public string Status { get; set; }
    [DataMember(Name = "user_name")]
    public string UserName { get; set; }
    [DataMember(Name = "person_pk")]
    public string PersonID { get; set; }
}

StringBuilder sb = new StringBuilder();
sb.Append("<auth xmlns=\"http://schemas.datacontract.org/2004/07/Veracross\">");
sb.Append("<status>success</status>");
sb.Append("<person_pk>2516</person_pk>");
sb.Append("<user_name>scohen</user_name>");
sb.Append("</auth>");

string fixedXMLData = sb.ToString();

DataContractSerializer serializer = new DataContractSerializer(typeof(Authorization));
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(fixedXMLData));
Authorization Auth = (Authorization)serializer.ReadObject(stream);

Когда я проверяю объект Auth после выполнения, я обнаруживаю, что Status и UserName заполнены правильно.PersonID является нулем.Я попытался изменить имена полей в строке XML, изменить порядок полей, изменить содержимое поля person_pk и т. Д. Ничто не заставляет его работать.

Теперь вот где это становится странным - если я изменяю "person_pk"чтобы" проверить "везде, он работает нормально, и я получаю правильное значение для PersonID.Однако, если я поменяю "person_pk" на "person" или "pk", он все равно не будет работать?На самом деле, я получаю эту XML-строку из службы RESTful и не могу управлять именами полей.Поле называется "person_pk", я просто не могу понять, почему оно не будет правильно десериализовано.

Есть идеи?

Спасибо

РЕШЕНИЕ: Я обновилмои атрибуты DataMember для включения атрибута Order:

[DataContract(Name = "auth")]
public class Authorization
{
    [DataMember(Name = "status", Order=0)]
    public string Status { get; set; }
    [DataMember(Name = "person_pk", Order=1)]
    public string PersonID { get; set; }
    [DataMember(Name = "user_name", Order=2)]
    public string UserName { get; set; }
}

1 Ответ

0 голосов
/ 25 февраля 2012

Измените порядок полей в файле XML так, чтобы person_pk предшествовал status :

sb.Append("<auth xmlns=\"http://schemas.datacontract.org/2004/07/Veracross\">");
sb.Append("<person_pk>2516</person_pk>");
sb.Append("<status>success</status>");
sb.Append("<user_name>scohen</user_name>");
sb.Append("</auth>");

DataSerializer также учитывает порядок полей.

UPDATE: Вас может заинтересовать эта дискуссия: Игнорировать порядок полей в DataContractSerializer

...