пятница, 6 мая 2011 г.

.NET Remoting. Типы объектов

        Прежде чем приступить к написанию программ с использованием .NET Remoting, необходимо ознакомиться с базовыми типами, которые данная технология использует. Каждая программа имеет в своём расположении определённый набор данных и памяти, с которыми она может работать. Программа не может использовать чужой участок памяти либо данных. Таким образом появляются границы приложения, за которые оно не может выйти. .NET Remoting позволяет пересекать эти границы.

        В общем случае, все объекты .NET Remoting разделяются на 2 типа: дистанциируемые и недистанциируемые. Отличаются они лишь тем, что дистанциируемые типы способны пересекать границы .NET Remoting, а недистанциируемые - соответственно нет. Если попытаться передать недистанциируемый объект через границу, то будет сгенерировано исключение. Далее подробнее рассмотрим дистанциируемые типы.

        Дистанциируемые типы

        Дистанциируемые типы можно разделить на 3 категории:

    •  передаваемые по значению(marshal-by-value);
    •  передаваемые по ссылке(marshal-by-reference);
    •  контекстно-связанные(context-bound).

        Обозначим сервером -  приложение, объект которого мы хотим получить, а клиентом - приложение, которое хочет получить объект сервера.

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

[Serializable]
class SomeRemoteClass
{
        // Some code
}

        Если мы выполняем передачу по ссылке, то приложение получит не копию объекта, а ссылку на него. Это очень эффективно, если необходимо работать с данными, которые храняться только на сервере, что позволит избежать передачи данных клиенту, кроме передачи ему ещё и объекта. Класс объекта должен быть наследован от класса MarshalByRefObject.
        В общем виде объявление класса объекта будет выглядеть так:

class SomeRemoteClass : MarshalByRefObject
{
        // Some code
}

        Контекстно-связанные типы являются частным случаем типов, передаваемых по ссылке. Экземпляры данного типа должны оставаться в рамках заданного контекста. Внешние по отношению к данному контексту типы не имеют доступ к контекстно-связанному объекту. Класс объекта должен быть наследован от класса ContextBoundObject.
        В общем виде объявление класса объекта будет выглядеть так:

class SomeRemoteClass : ContextBoundObject
{
        // Some code
}

        Далее будем рассматривать примеры с использованием типов, передаваемых по ссылке.

Комментариев нет:

Отправить комментарий