Подтвердить что ты не робот

Сериализуемый и DataContract (не против?)

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

[Serializable]

и

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

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

4b9b3361

Ответ 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 работают отлично.