Передача пользовательских сложных объектов между сервером и клиентом в C # - PullRequest
1 голос
/ 16 июля 2011

У меня есть настольное приложение C #, которое я хочу разделить на две части - серверную и клиентскую части.Мое приложение уже разделено на две очень независимые части, которые обмениваются друг с другом путем обмена некоторыми (сложными!) Объектами.

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

Вот почему я запуталсяи нужна ваша помощь: какую технологию удаленного взаимодействия я должен использовать в моем случае?

Ответы [ 2 ]

4 голосов
/ 16 июля 2011

WCF обозначает Windows Связь Фонд. Другими словами, речь идет об общем межпроцессном / машинном взаимодействии и не ограничивается гетерогенными системами

Одна вещь, которую следует помнить о WCF, - это то, что, несмотря на видимости, вы фактически вообще не передаете объекты - объекты используются сериализатором для генерации сообщений. На другом конце он десериализуется в независимую копию. В отличие от COM, вы не получаете ссылку на объект отправителя.

Причина, по которой это важно, заключается в том, что если сложные объекты находятся в несериализуемом состоянии, например, в соединении с сокетом, это не приведет к их получению

Кроме того, с помощью DataContractSerializer (который используется по умолчанию), если ваши объекты не аннотированы атрибутом [Serializable] или вы не аннотируете классы с помощью [DataContract] и [DataMember], вы будете отправлять только то состояние, которое открыто для общественности (через публичное поле или собственность).

Это не просто проблема для WCF; Для удаленного взаимодействия требуются объекты, производные от MarshalByRefObject или аннотируемые атрибутом [Serializable]. Построение распределенных систем весьма отличается от построения систем, которые все используют одно и то же адресное пространство памяти. Вы должны тщательно продумать, как вы определяете эту границу между распределенными частями, потому что, например, большое количество небольших вызовов снизит вашу производительность, а не несколько вызовов с большим количеством данных (хотя из вашего описания это может не быть проблемой, которая вас касается)

Таким образом, WCF может обрабатывать произвольно сложные графы объектов, но просто запомните приведенные выше пункты о сериализации

0 голосов
/ 16 июля 2011

Ну, DataContracts в WCF поддерживают сложные объекты, поэтому я не вижу проблемы с этим (насколько сложны ваши объекты);однако вам, вероятно, следует использовать технологию, которая достаточна в вашем случае.Вы можете использовать Remoting, ад, даже сокеты;но это почти во всех случаях излишнее и слишком низкое значение в стеке .NET;вы просто будете тратить время на реализацию.

Если у вас нет оснований против WCF, я бы пошел по этому пути, потому что это очень просто и мощно.Существуют также стандартные веб-службы ASP.NET ASMX, если хотите.

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

...