Сериализуемый и DataContract (не против?) - PullRequest
11 голосов
/ 22 ноября 2010

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

[Serializable]

и

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

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

1 Ответ

17 голосов
/ 22 ноября 2010

Да, [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 будут работать идеально.

...