MarshalByRefObject

Имеется два способа, которыми клиент может взаимодействовать с объектами, расположенными на сервере. Во-первых, мы можем передавать клиенту ссылку на объект, выполняющийся на сервере. Клиент будет осуществлять вызовы по этой ссылке. Как будто это локальный объект. Однако когда производятся вызовы, ссылка будет на самом деле передавать вызовы в серверный процесс, там исполнять запрос и при помощи маршалинга передавать результаты обратно клиенту. Объекты, которые доступны через удаленный доступ как MarshalByRefObject, исполняются на сервере; на стороне клиента не выполняется никакой работы. Клиент имеет объект-прокcи, который отвечает за взаимодействие с сервером. Объект на сервере наследуется от System.MarshalByRefObject, который является базовым классом для того, чтобы позволить клиенту взаимодействовать с прокcи-объектами.

Сериализуемый (ByValue - по значению)

В отличие от MarshalByRefObject; мы можем реализовать объект, который, будучи созданным, передается назад клиенту. Клиент запрашивает объект у сервера, сервер создает этот объект, сериализует его в текстовое или двоичное представление и полностью передает его клиенту. Как только клиент получает этот объект в сое распоряжение, между клиентом и сервером не происходит никакого взаимодействия. Все вызовы выполняются относительно объекта, который выполняется на стороне клиента, как будто клиент сам создал этот объект. Сериализуемые объекты часто называются «Передаваемыми» (маршализуемыми) по значению, чтобы подчеркнуть то, что клиенту передается весь объект целиком, а не только ссылка на него.

В .NET все, что мы должны сделать, чтобы передавать наш объект от сервера к клиенту по значению -это предоставить атрибут Serializable. Структура удаленного доступа сама позаботится об упаковке объекта, пересылке его к клиенту и воссоздании его в пространстве клиента.