Строго говоря говоря, вам не нужно использовать какие-либо атрибуты для обоих ;-p Раньше DataContractSerializer
требовало [DataContract]
/ [DataMember]
( и они абсолютно должны использоваться), но вы можете использовать его без (но тогда он действует очень сомнительно, как BinaryFormatter
). Точно так же, XmlSerializer
ничего не нужно , если вы не хотите что-то контролировать. Однако следует отметить некоторые отличия:
XmlSerializer
требует (и использует) открытый конструктор без параметров; DataContractSerializer
не использует конструктор (вообще). Так что следите за этим и не полагайтесь (для WCF) на код в ctor - если у вас есть необходимый код инициализации, используйте обратный вызов сериализации для WCF.
XmlSerializer
требует либо публичных полей (да), либо публичных свойств с get
и set
(даже для списков); DataContractSerializer
будет успешно работать с закрытыми членами, свойствами с (например) общедоступными get
и частными set
, а также коллекциями без набора `(если ваш тип его инициализирует).
XmlSerializer
требует публичных типов; IIRC DataContractSerializer
менее суетливый
Так что да; Вы можете поддерживать оба сериализатора, а также можете добавить любое количество атрибутов параллельно , но обратите внимание на вышесказанное, если вы хотите полной совместимости.
Другой вариант - просто использовать XmlSerializer
; вы можете настроить WCF на использование XmlSerializer
с помощью [XmlSerialzerFormat]
. Оба варианта поддерживают наследование через [XmlInclude]
и [KnownType]
.
Наконец, обратите внимание, что если вы реализуете IXmlSerializable
, это имеет приоритет над любым, но это трудно понять правильно. Не делай этого, если не обязан.