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