лучший способ десериализации XML в C #? - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть следующий xml:

<return_obj from_call_to="categories">
  <categories>
    <category>
      <value>12341234</value>
      <label>First</label>
    </category>
    <category>
      <value>242234234</value>
      <label>Another</label>
    </category>
  </categories>
</return_obj>

, поэтому я разметил объект для сериализации этого в

[XmlRoot(ElementName = "return_obj")]
public class returnobject
{
    [XmlElement]
    public category[] categories { get; set; }
}

public class category
{
    [XmlElement]
    public string value { get; set; }
    [XmlElement]
    public string label { get; set; }
}

и попытался использовать это для этого

    var ser = new XmlSerializer(typeof (returnobject));
    var obj = (returnobject)ser.Deserialize(File.OpenRead("test.xml"));

Тем не менее, коллекция категорий всегда имеет некоторые значения. Null.

Что я делаю не так?Есть ли лучший способ?

Спасибо

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

Сделать поле categories общедоступным в class returnobject. Это помогло бы.

1 голос
/ 28 апреля 2011

XmlSerializer просматривает только открытые поля и свойства, поэтому вы должны сделать categories общедоступным в вашем returnobject классе.

Также вам нужно указать имя контейнера массива XML, который вы хотите использоватьв твоем случае categories - у меня это сработало:

[XmlRoot(ElementName = "return_obj")]
public class returnobject
{
    [XmlArray("categories")]
    [XmlArrayItem("category")]
    public category[] categories { get; set; }
}
0 голосов
/ 28 апреля 2011

FYI, XmlSerializer должен генерировать информацию о типах типов сериализации. Это может занять некоторое время, поэтому сериализация и десериализация могут занять несколько сотен миллисекунд. Вы можете обойти это, запустив SGEN для предварительной генерации сборок сериализации.

В качестве альтернативы, вы можете использовать XmlReader для чтения XML и просто кодировать сериализацию самостоятельно. Это больше кода, но он всегда работает хорошо и не обременен дополнительной сборкой (сгенерированной или нет).

...