Что такое использование атрибута [Datacontract] в классе сущностей WCF
Я использую.net 4.0 и сервис wcf. У меня есть бизнес-классы, которые не определены с [Datacontract]
приписывать.
Когда я пытаюсь получить менее 1000 записей класса бизнес-объекта типа, он работает нормально, но когда я пытаюсь получить более 1000 записей класса бизнес-объекта типа, выдается это исключение:
Средство форматирования выдало исключение при попытке десериализации сообщения: при попытке десериализации параметра http://tempuri.org/:Securities произошла ошибка. Сообщение InnerException было "Максимальное количество элементов, которые могут быть сериализованы или десериализованы в графе объектов, равно 65536". Измените граф объекта или увеличьте квоту MaxItemsInObjectGraph. ". Пожалуйста, смотрите InnerException для более подробной информации.
Проблема была решена при использовании [DataContract]
атрибут, определенный для класса бизнес-объекта.
- так какое значение имеет
[DataContract]
атрибут play в приведенном выше случае? - В чем разница между использованием класса бизнес-объекта, определенного с
[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
настройки (но ваши клиенты, очевидно, не получат ни одного из несериализованных объектов).