Сериализация XML и XMLChoiceAttribute

215
06 апреля 2019, 09:40

Пытаюсь сериализовать простой объект:

public class ChargesConditions
  {
      public string supplierBillID;
      public ChargesConditions() { }
  }
  public class PayersConditions
  {
      public string payerIdentifier;
      public PayersConditions() { }
  }
  [XmlType(IncludeInSchema = false)]
  public enum ItemChoiceType
  {
      Payers,
      Charges
  }
  public class Choices
  {
      [XmlChoiceIdentifier("ItemType")]
      [XmlElement("PayersConditions", Type = typeof(PayersConditions))]
      [XmlElement("ChargesConditions", Type = typeof(ChargesConditions))]
      public object Choice;
      [XmlIgnore]
      public ItemChoiceType ItemType;
  }
  class Program
  {
      static void Main(string[] args)
      {
          ChargesConditions charge = new ChargesConditions();
          charge.supplierBillID = "123";
          Choices c1 = new Choices();
          c1.ItemType = ItemChoiceType.Charges;
          c1.Choice = charge;
          var serializer = new XmlSerializer(typeof(Choices));
          using (var stream = new FileStream("Choices.xml", FileMode.Create))
              serializer.Serialize(stream, c1);
      }
  }

Программа генерирует исключение InvalidOperationException в строке

var serializer = new XmlSerializer(typeof(Choices));

Что я делаю неправильно?

Answer 1

Имена элементов должны соответствовать значениям перечисления:

[XmlChoiceIdentifier("ItemType")]
[XmlElement("Payers", Type = typeof(PayersConditions))]
[XmlElement("Charges", Type = typeof(ChargesConditions))]
public object Choice;

Можно записать так, будет ещё понятней:

[XmlChoiceIdentifier("ItemType")]
[XmlElement(nameof(ItemChoiceType.Payers), Type = typeof(PayersConditions))]
[XmlElement(nameof(ItemChoiceType.Charges), Type = typeof(ChargesConditions))]
public object Choice;
READ ALSO
Как получить путь к *.exe службы Windows через ServiceController

Как получить путь к *.exe службы Windows через ServiceController

В системе имеется установленная службаУправление ею из другого приложения осуществляется через ServiceController:

308
прекращение работы Microsoft visual studio 2017

прекращение работы Microsoft visual studio 2017

При попытке обновить таблицу в бд в microsoft visual studio 2017 вылетает из программы, после захода в программу созданная таблица исчезает (скорее всего...

165
Помогите с кодом для DFS с рекурсией

Помогите с кодом для DFS с рекурсией

Помогите с кодом на C# для рекурсивного поиска пути в графе

148