2010-11-22 2 views
11

Я читаю код в своем новом проекте и узнал, что экс-разработчик использовал Serializable и DataContract вместе.Serializable и DataContract (не против?)

[Serializable] 

и

[DataContract(Namespace="Some.Name.Space", IsReference = true)] 

Я предполагаю, что WCF будет игнорировать Сериализуемый, когда есть DataContract атрибут. Это правильное предположение? Если нет, каковы преимущества использования обоих одновременно?

ответ

15

Да, [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 работают отлично.

+0

спасибо за подробное объяснение. – fizmhd 2016-02-08 07:51:23

Смежные вопросы