Да, [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 работают отлично.
спасибо за подробное объяснение. – fizmhd 2016-02-08 07:51:23