2010-05-29 3 views
1

Нужно ли украшать пользовательские объекты [DataContract] и [DataMember] при использовании общих сборок (в отличие от генерации автоматического прокси)?DataContractAttribute с общей сборкой

Я спрашиваю, что я столкнулся следующий сценарий:

Предположим, что следующий объект реализуется в моей службы:

public class baseClass 
{ 
    Guid _guid; 

    public baseClass() 
    { 
     _guid = Guid.NewGuid() 
    } 

    public Guid ReturnGuid { get {return _guid;}} 
} 

public class newClass : baseClass 
{ 
    int _someValue; 

    public newClass {} 

    public int SomeValue 
    { 
     get {return _someValue;} 
     set {_someValue = value;} 
    } 
} 

[ServiceContract] 
public IService 
{ 
    [OperationContract] 
    newClass SomeOperation(); 
} 

В моем клиенте (с общими узлами) я могу с радостью принимать и используйте сериализованный newClass, когда вызывается SomeOperation, хотя я не отмечен как DataContract.

Однако, как только я помечаю его DataContract и использую DataMember, он жалуется, что набор не реализован в ReturnGuid в базовом классе.

Может кто-нибудь объяснить, почему он отлично работает, когда я не украшаю DataContract и DataMember.

Большое спасибо.

ответ

0

Корпорация Майкрософт представила изменение в пакете обновления .NET 3.5 с учетом того, что атрибуты DataContract/DataMember больше не требуются.

Так что, если вы этого не хотите, вам не нужно иметь эти атрибуты. Если опустить эти атрибуты, то DataContractSerializer будет сериализовать класс объекта точно так же как XmlSerializer будет:

  • упорядочивает все общественные чтения/записи свойства (свойства, которые обладают одновременно get, а также метод set)
  • Сериализует их в том порядке, в котором они отображаются в определении класса

Так что нет - вам больше не нужно иметь эти атрибуты. Но если вы их не заметите, вы также потеряете преимущества их использования: вы не можете определить член, который требуется, вы не можете определить порядок, в котором атрибуты должны быть упорядочены в сериализованном XML и т. Д.

0

Когда был выпущен .NET 3.0, чтобы сериализовать объект с использованием DataContractSerializer, все классы и свойства должны были быть отмечены этими атрибутами независимо от того, использовались ли вы общие сборки или сгенерированные прокси. Начиная с .NET 3.5 SP1 вы получаете no longer need to put those attributes, поскольку все публичные свойства будут сериализованы. Проблема в вашем случае заключается в том, что по умолчанию ReturnGuid не сериализуется, поскольку у него нет сеттера, и если вы поместите атрибуты, вы обеспечите сериализацию свойства, у которого нет сеттера, и он жалуется.

Несмотря на то, что вы можете опустить эти атрибуты, я бы рекомендовал вам использовать их во всех ваших сущностях. Что касается свойства ReturnGuid, если вы хотите, чтобы это передавалось по проводу, добавьте сеттер.

public Guid ReturnGuid 
{ 
    get { return _guid; } 
    set { _guid = value; } 
} 
+0

Что такое причины использования этих атрибутов, даже если нам это не нужно? –

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