Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

return a;

}

set {

a = value;

}

}

protected int a;

 }

 public class MyRemote : System.MarshalByRefObject {

public MyRemote(int val) {

a = val;

}

public void Foo {

Console.WriteLine("MyRemote.Foo called");

}

public int A {

get

Сonsole.WriteLine("MyRemote.A called");

return a;

}

set {

a = value;

}

}

protected int a;

 }

 /// <summary>

 /// Краткое описание Class1

 /// </summary>

 public class Hello : System.MarshalByRefObject {

public Hello {

Console.WriteLine("Constructor called");

}

~Hello {

Console.WriteLine("Destructor called");

}

public string Greeting(string name) {

Console.WriteLine("Greeting called");

return "Hello, " + name;

}

public MySerialized GetMySerilized {

return new MySerialized(4711);

}

public MyRemote GetMyRemote {

return new MyRemote(4712);

}

 }

}

Клиентское приложение также необходимо изменить, чтобы увидеть результаты при использовании маршализации объектов по значению и по ссылке. Мы вызываем методы

GetMySerialized
и
GetMyRemote
, чтобы получить новые объекты и проверить, не используется ли прозрачный прокси.

ChannelServices.RegisterChannel(new TcpChannel);

Hello obj =

 (Hello)Activator.GetObject(typeof(Hello),

 "tcp://localhost:8086/Hi");

if (obj == null) {

 Console.WriteLine("could not locate server");

 return;

}

MySerialized ser = obj.GetMySerialized;

if (!RemotingServices.IsTransparentProxy(ser)) {

 Console.WriteLine("ser is not a transparent proxy");

}

ser.Foo;

MyRemote rem = obj.GetMyRemote;

if (RemotingServices.IsTransparentProxy(rem)) {

 Console.WriteLine("rem is a transparent proxy");

}

rem.Foo;

В консольном окне клиента видно, что объект

ser
вызывается на клиенте. Этот объект не является прозрачным прокси, так как он сериализуется клиенту. В противоположность этому, объект
rem
на клиенте является прозрачным прокси. Методы, вызванные для этого объекта, передаются на сервер:

В серверном выводе можно видеть, что метод

Foo
вызывается с удаленным объектом
MyRemote
:

Направляющие атрибуты

Удаленные объекты никогда не передаются по линиям связи в отличие от типов данных значений и сериализуемых классов. Иногда желательно послать данные только в одном направлении. Это особенно важно, когда данные передаются по сета. С помощью COM можно было объявить для аргументов направляющие атрибуты

[in]
,
[out]
и
[in, out]
, если данные должны посылаться на сервер, клиенту или в обоих направлениях.

В C# существуют аналогичные атрибуты как часть языка: параметры методов

ref
и
out
. Параметры методов
ref
и
out
могут использоваться для типов данных значений и для ссылочных типов, которые способны сериализоваться. С помощью параметра
ref
аргумент маршализуется в обоих направлениях,
out
идет от сервера клиенту, а в отсутствие параметра метода посылает данные серверу.

Управление временем жизни

  • Читать дальше
  • 1
  • ...
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: