Как передать общий объект через WCF - PullRequest
0 голосов
/ 14 мая 2009

Можно ли передавать универсальные объекты (под универсальными, я имею в виду любые с DataContract, а не C # универсальной коллекцией) без наследования от одного корня? На данный момент у меня есть что-то вроде этого:

[OperationContract]
void Save(GenericObject o);

[DataContract]
[KnownType(typeof(ClassA))]
[KnownType(typeof(ClassB))]
class GenericObject {....

[DataContract]
class ClassA: GenericObject {....


[DataContract]
class ClassB: GenericObject {....

Все было хорошо, но проект стал больше, и я не могу позволить себе выводить все эти контракты из одного класса.

Я не хочу добавлять специализированные методы в сервис. В качестве обходного пути я могу вручную сериализовать классы в строку или byte [] через DataContractSerializer и десериализовать их на стороне сервера: void Save (byte [] serializedObject), но это немного хак.

Я заметил, что могу легко возвращать общие объекты, например, Загрузка объекта (идентификатор строки) работает просто отлично, но void Save (объект o) - нет.

Я использую Silverlight в качестве клиента.

1 Ответ

1 голос
/ 14 мая 2009

Да, вы можете использовать общий тип Message для проектов WCF, который на самом деле может быть любым. Однако это налагает на вас много работы, как на стороне клиента, создающего объект сообщения (вам, в основном, нужно вручную создать XML, который составляет общее сообщение), так и на стороне сервера, поскольку вы не можете полагаться на хорошую сериализацию / десериализацию XML больше. Вы имеете дело с простым сырым угловым супом (прямой XML).

Это работает, и это может быть решением - но, может быть, есть другие, более элегантные и полезные решения? Это наследство действительно нужно вообще? Подумайте о дизайне вашей системы.

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...