Прежде чем приступить к написанию программ с использованием .NET Remoting, необходимо ознакомиться с базовыми типами, которые данная технология использует. Каждая программа имеет в своём расположении определённый набор данных и памяти, с которыми она может работать. Программа не может использовать чужой участок памяти либо данных. Таким образом появляются границы приложения, за которые оно не может выйти. .NET Remoting позволяет пересекать эти границы.
В общем случае, все объекты .NET Remoting разделяются на 2 типа: дистанциируемые и недистанциируемые. Отличаются они лишь тем, что дистанциируемые типы способны пересекать границы .NET Remoting, а недистанциируемые - соответственно нет. Если попытаться передать недистанциируемый объект через границу, то будет сгенерировано исключение. Далее подробнее рассмотрим дистанциируемые типы.
Дистанциируемые типы
Дистанциируемые типы можно разделить на 3 категории:
Обозначим сервером - приложение, объект которого мы хотим получить, а клиентом - приложение, которое хочет получить объект сервера.
В случае если мы выполняем передачу по значению, объекты, которые будут переданы клиенту должны сначала пройти процесс сериализации на сервере. После этого они передаються в качестве потока бит клиенту, и там проходят процесс десериализации. В данном случае мы получаем точную копию объекта с сервера.
В общем виде объявление класса объекта будет выглядеть так:
[Serializable]
class SomeRemoteClass
{
// Some code
}
Если мы выполняем передачу по ссылке, то приложение получит не копию объекта, а ссылку на него. Это очень эффективно, если необходимо работать с данными, которые храняться только на сервере, что позволит избежать передачи данных клиенту, кроме передачи ему ещё и объекта. Класс объекта должен быть наследован от класса MarshalByRefObject.
В общем виде объявление класса объекта будет выглядеть так:
class SomeRemoteClass : MarshalByRefObject
{
// Some code
}
Контекстно-связанные типы являются частным случаем типов, передаваемых по ссылке. Экземпляры данного типа должны оставаться в рамках заданного контекста. Внешние по отношению к данному контексту типы не имеют доступ к контекстно-связанному объекту. Класс объекта должен быть наследован от класса ContextBoundObject.
В общем виде объявление класса объекта будет выглядеть так:
class SomeRemoteClass : ContextBoundObject
{
// Some code
}
Далее будем рассматривать примеры с использованием типов, передаваемых по ссылке.
В общем случае, все объекты .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
}
Далее будем рассматривать примеры с использованием типов, передаваемых по ссылке.
Комментариев нет:
Отправить комментарий