Преобразование сериализованных объектов WCF обратно в собственные объекты

Я скучаю по временам удаленного взаимодействия .Net, когда я мог просто отправить объект по сети, и он работал бы на обеих сторонах среднего уровня без особого труда. Вот почему:

Мне дали задание. Я создаю уровень абстракции логики/данных (дурацкое соответствие PCI), чтобы мы могли переместить наши серверы баз данных из корпоративной сети в защищенную сеть. Делал когда-то такой проект под .Net 2.0 с удаленкой. Я построил объект на уровне промежуточного программного обеспечения и отправил этот объект клиенту, и у клиента был мой объект .Net для работы. Но WCF требует сериализации, чтобы иметь возможность отправлять вещи вверх и вниз по каналу, и сериализация лишает меня причудливых методов, которые делают невероятные вещи с полями, которые у меня есть.

Я придумал две разные стратегии, чтобы обойти это: (1) переместить методы из самого класса в статический служебный класс и (2) «десериализовать» данные на стороне клиента и перестроить собственный объект с данными из сериализованный объект.

nativeObject.Name = serializedObject.Name;

Недостаток второго метода заключается в том, что мне нужно повторно сериализовать объект, прежде чем я смогу отправить его обратно на уровень промежуточного программного обеспечения.

serializedObject.Name = nativeObject.Name;

Оба метода работают, но запись объектов занимает гораздо больше времени, чем следовало бы, из-за всего беспорядка сериализации, который вызывает средний уровень. Я бы вернулся к .Net Remoting, но архитектор говорит, что хочет, чтобы этот уровень абстракции был реализован в WCF, потому что (мои слова, а не его) это ново и привлекательно.

Так как же работать с нативными объектами .Net по обе стороны соединения WCF... без написания 1000 строк связующего кода.


person thaBadDawg    schedule 30.12.2008    source источник


Ответы (1)


Вы можете сгенерировать прокси и указать ему использовать определенный набор классов вместо создания новых. Я полагаю, что это делается с помощью параметра /r svutil.exe. Если вы используете IDE (VS2008), вы можете сделать это при добавлении ссылки на службу, нажмите «Дополнительно» и убедитесь, что выбрано «Повторное использование типов в сборках» (я думаю, что это значение по умолчанию).

person JoshBerke    schedule 30.12.2008
comment
Получается, что недостаток моего дизайна заключался в том, что я забыл включить сборку Models в проект ServiceReference. Я не знаю, идиот я или ты чертов гений. Чтобы я мог чувствовать себя лучше, я голосую за то, что ты чертов гений. - person thaBadDawg; 30.12.2008
comment
хех рад помочь, это всегда простые вещи, которые вызывают у нас наибольшее разочарование... - person JoshBerke; 30.12.2008