Что такое использование атрибута [Datacontract] в классе сущностей WCF

Я использую.net 4.0 и сервис wcf. У меня есть бизнес-классы, которые не определены с [Datacontract] приписывать.

Когда я пытаюсь получить менее 1000 записей класса бизнес-объекта типа, он работает нормально, но когда я пытаюсь получить более 1000 записей класса бизнес-объекта типа, выдается это исключение:

Средство форматирования выдало исключение при попытке десериализации сообщения: при попытке десериализации параметра http://tempuri.org/:Securities произошла ошибка. Сообщение InnerException было "Максимальное количество элементов, которые могут быть сериализованы или десериализованы в графе объектов, равно 65536". Измените граф объекта или увеличьте квоту MaxItemsInObjectGraph. ". Пожалуйста, смотрите InnerException для более подробной информации.

Проблема была решена при использовании [DataContract] атрибут, определенный для класса бизнес-объекта.

  1. так какое значение имеет [DataContract] атрибут play в приведенном выше случае?
  2. В чем разница между использованием класса бизнес-объекта, определенного с [DataContract] атрибут и без [DataContract] атрибут?

1 ответ

Применяя [DataContract] классу вы говорите WCF, что вы будете явно указывать, какие свойства должны быть сериализованы DataContractSerializer.

По умолчанию без [DataContract]DCS будет сериализовать все общедоступные свойства, например, с учетом приведенного ниже, если вы сериализуете экземпляр House, Window и Door, также будет полностью сериализован.

public class Window
{
  public string Colour {get; set;}
  public bool IsClean {get; set; }
}


public class Door
{
  public string Colour {get; set;}
  public bool IsOpen {get; set; }
}


public class House
{
  public Door Door {get; set;}
  public Window Window {get; set; }
}

Для сравнения, если вы укажете [DataContract] на дом, то только члены с [DataMember] атрибут будет сериализован, а именно в случае ниже, только свойство Address дома будет сериализовано:

[DataContract]
public class House
{
  [DataMember]
  public string Address {get; set;}

  // Omitted DataMember!
  public Door Door {get; set;}
  public Window Window {get; set; }
}

Я угадываю причину, почему добавление [DataContract] работает в вашем случае, вероятно, потому, что вы добавили его в корневую сущность, но где-то вниз по цепочке графа сущностей одна или несколько составных сущностей не имеют [DataMember] приписывать. Если вы только что отметили свою корневую сущность как [DataContract] без [DataMember]s тогда только корневая сущность сериализуется, таким образом избегая MaxItemsInGraph настройки (но ваши клиенты, очевидно, не получат ни одного из несериализованных объектов).

Другие вопросы по тегам