XmlSerializer.Serialize неоднозначный - PullRequest
5 голосов
/ 19 июня 2009

Я создал тестовое приложение, которое имеет 3 класса

  • Car
  • Радио
  • SportCar: Автомобиль (есть радио)

В качестве процесса сериализации при создании экземпляра объекта XmlSerializer для тестирования я использую 2 объекта

XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar));

и

XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 

Результат этого подхода 2 идентичен, поэтому я хочу знать, в чем разница между этими двумя конструкторами или критической точкой, которые должны использовать конструктор №2?

1 Ответ

8 голосов
/ 19 июня 2009

Большая разница в том, когда вам нужно рассказать XmlSerializer о под классах - например:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car),
     new Type[] { typeof(SportCar), typeof(Radio) });

Здесь, без дополнительной информации, если бы не знал (просто из Car) о SportCar или Radio - поэтому, если вы дадите ему объект, который на самом деле является SportCar, он потерпит неудачу :

Car car = new SportCar {...};
xmlSerializer.Serialize(destination, car);

Вы также можете сделать это, установив [XmlInclude(typeof(SportCar))] против определения типа Car:

[XmlInclude(typeof(SportCar))]
public class Car {...}

Это проще, но возможно, только если тип Car находится в сборке, которая знает о SportCar. Но вы часто делаете это знаете, поэтому XmlInclude является предпочтительным вариантом.

Дополнительно: есть некоторые преимущества в эффективности XmlInclude; За кулисами система использует динамическое генерирование типов, чтобы повысить эффективность XmlSerializer. По этой причине вы обычно должны держать (и повторно использовать) экземпляр XmlSerializer, который вы создаете; например, сохраняя его в статическом поле. Однако система делает это автоматически для использования по умолчанию (new XmlSerializer(typeof(Car))) - т.е. независимо от того, сколько раз вы используете этот конструктор, динамический код генерируется только один раз. Если вы используете более сложный конструктор (new XmlSerializer(typeof(Car),new Type[] { typeof(SportCar), typeof(Radio) })), он будет каждый раз генерировать тип.

...