У меня есть различные классы, которые я хочу представить как сложные типы в WCF, поэтому я добавляю атрибуты [DataContract] и [DataMember] по мере необходимости для этих типов и свойств.
Однако, если я хочу, чтобы они наследовали от абстрактного базового класса (например, Person наследует от абстрактного EntityBase), я получаю ошибку, что тип "не может наследовать от типа, который не помечен с помощью DataContractAttribute или SerializableAttribute". 1003 *
Проблема в том, что если я добавлю атрибут [DataContract] в базовый класс, то этот базовый класс будет доступен клиенту через WSDL. Думаю, это не так уж и сложно, но я бы предпочел, чтобы мой клиент не знал о моей внутренней реализации.
Если я добавлю атрибут [Serializable] в базовый класс, то сначала он будет работать (его можно сериализовать, но в WSDL нет ссылки на EntityBase), но теперь, если я добавлю какие-либо свойства в EntityBase, он будет также жалуются, что его свойства не сериализуемы. (Например, я добавляю ICollection, а затем получаю ошибку, что RuleViolation не сериализуем).
К сожалению, похоже, что нет аналога [IgnoreDataMember] для типа [Serializable] ([NonSerialized применяется только к полям, а не к свойствам).
Итак, в основном я хочу объявить этот базовый тип, но не нужно, чтобы его члены были сериализованы; Есть ли способ настроить это в WCF, чтобы клиент не видел этот базовый тип?