Ватсон Карли
Шрифт:
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
идет от сервера клиенту, а в отсутствие параметра метода посылает данные серверу. Управление временем жизни