лучший способ десериализации xml в c #?

#c# #linq-to-xml #xmlserializer #xml-deserialization

#c# #linq-to-xml #xmlserializer #xml-десериализация

Вопрос:

У меня есть следующий 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"));
  

Однако в коллекции categories всегда есть некоторые значения null.

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

Спасибо

Ответ №1:

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

Ответ №2:

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

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

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

Комментарии:

1. спасибо, это десериализовало «категории», но загружает только 1 отдельную категорию, и оба значения / метки равны нулю..

2. @andryuha: проверьте мою правку, мы, должно быть, опубликовали одновременно

3. потрясающе, это сработало it…is это распространенный способ десериализации xml?

4. @andryuha: Я бы сказал, да, это довольно распространенное использование XmlSerializer таким образом — в общем, вам следует избегать открытых полей, хотя в ваших классах вместо этого используйте свойства (также см. Соглашения об именовании camel case для них)

Ответ №3:

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

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