Ответ 1
Да, [Serializable]
игнорируется, если присутствует [DataContract]
. Это может быть полезно, например, создайте тип, который будет иметь один сериализационный прогноз для WCF и другой прогноз для .NET Remoting (если он используется вместе с WCF по причинам, устаревшим).
UPDATE. Я просто столкнулся с ситуацией в своем собственном коде, где были необходимы как [DataContract]
, так и [Serializable]
. Предположим, у вас есть класс с кучей автоматически генерируемых свойств (например, public int Foo {get; set;}
), который вы хотите использовать как в ASP.NET ViewState, так и в конечной точке JSON веб-API ASP.NET(который использует либо сериализатор Newtonsoft JSON, либо DataContractSerializer). Чтобы ViewState работал, вам нужен класс [Serializable]
. Однако это прерывает сериализацию JSON, вызывая JSON как {"_k_BackingField123":456}
вместо {"Foo":456}
, потому что в модели [Serializable]
автоматически создаваемые поля поддержки свойств становятся сериализованными вместо самих свойств. Однако, если вы добавите [DataContract]
к типу (и [DataMember]
к его свойствам), сценарии ViewState и JSON работают отлично.