Большая разница в том, когда вам нужно рассказать 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) })
), он будет каждый раз генерировать тип.