2013-11-14 12 views
20

Итак, я просматривал нашу базу кода, и я видел, что некоторые наши DTO имеют комбинацию и соответствие атрибутов и [IgnoreDataMember].У меня нет атрибута [DataMember], у которого есть атрибут [IgnoreDataMember]

В прошлом нам сказали, что если мы не хотим что-то в сериализованном DTO, просто не добавляйте атрибут [DataMember]. Затем я увидел другой атрибут и сделал некоторые копания, и кажется, что это явно указывает, что свойство не будет сериализовано.

Теперь мой вопрос: что лучше? Добавление [IgnoreDataMember] или ничего не добавляет.

Я спросил, и кажется, что [IgnoreDataMember] - это дни, когда все было сериализовано, и вам пришлось диктовать то, что следует игнорировать (я верю в .Net 2). Затем они изменили его на обратное, и вам нужно было четко указать, что ДОЛЖНО быть сериализовано. Теперь кажется, что вы можете сделать то и другое.

ответ

37

Я спросил, и кажется, что [IgnoreDataMember] - это дни, когда все было сериализовано, и вам нужно было диктовать, что следует игнорировать (я верю в .Net 2). Затем они изменили его на обратное, и вам нужно было четко указать, что ДОЛЖНО быть сериализовано.

На самом деле это не совсем так; IIRC это всегда было так:

  • если он помечен как [DataContract], то только члены отмечены [DataMember] считаются
  • если не помечается как [DataContract], то по умолчанию все, но вы можете вычитать членов, использующих [IgnoreDataMember]

Я обычно просто не пишите [DataMember] вещей, которые я не хочу сериализации, но во многих отношениях [IgnoreDataMember] более ясен - в основном в интересах сопровождающего. В нем говорится: «Я намеренно не сериализую это», а не «возможно, я знаю, что это не сериализуется, но, возможно, я просто забыл добавить атрибут».

Любой из них будет работать.

+3

также, согласно MS: «Атрибут IgnoreDataMemberAttribute выполняется только при использовании с немаркированными типами»; если вы используете '[DataContract]' и '[IgnoreDataMember]' в том же классе, последний игнорируется. –

+2

@MichaelEdenfield, чтобы быть педантичным, 'DataContractSerializer' по умолчанию имеет * все общедоступные поля и свойства * (публичные поля очень редки); и даже это немного неоднозначно. Например, если мы говорим о 'NetDataContractSerializer', то по умолчанию он имеет * все поля * (публичные и частные), но нет свойств –

+1

Я знаю, что это старый поток, но вчера я столкнулся с проблемой, которая указывает, что г-н Эденфилд сказал не совсем так. У меня есть класс с одним полем и 4 свойствами. Все 4 свойства преобразуют некоторую форму данных (например, байтовый массив, строка или другие) и записывают его в одно поле. Я пометил класс атрибутом DataContract и пометил только поле как DataMember. Однако таким образом десериализатор НЕ игнорировал свойства, но устанавливал их по умолчанию (что бы переписать это поле). Добавление [IgnoreDataMember] к свойствам исправило проблему. Поэтому он не игнорируется –

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