这两种方式的类一般都是用于远程传输时使用。
marshalbyrefobject是通过引用传递serializable是通过值传递,现在就来分析下什么是引用传递,什么是值传递。
理解这个对Remoting或者webservice的认识是很重要的。
marshalbyrefobject(引用)本机或者是服务器上的其实都是同一个实例,只不过是服务器创建后你在本地使用了那个对象而已。比如说A类继承了marshalbyrefobject那么A类由服务器创建实例了,客户端都可以使用这个实例了。
现在我们假设A类有一个方法叫着A,Function返回值为一个string类型这个方法有一系列的操作。客户端在调用这个方法的时候只得到服务器返回的一个值,那个一系列的操作都将在服务器完成,这就是所谓的馊客服端。
Serializable(值类型)这个就不同了,假定我们刚才的那个A类的Funciton方法需要一个B类作为参数,B是一个可序列化的类,也就是类的定义上面加了[Serializable()],如果没加那么这个方法将会报错。我们通过一个remoting的例子来解释一下
先写一个继承marshalbyrefobject的类
public class HelloServer : MarshalByRefObject
{ public HelloServer() { Console.WriteLine("HelloServer activated"); } public String HelloUserMethod(User user) { string title; if (user.Male) title = "先生"; else title = "女士";Console.WriteLine( "Server Hello.HelloMethod : 你好,{0}{1}", user.Name,title);
return "你好," + user.Name + title;
}}
再写一个可序列化的类
[Serializable]
public class User { public User(string name,bool male) { this.name = name; this.male = male; } string name=""; bool male=true; public string Name { get{return name;} set{name = value;} } public bool Male { get{return male;} set{male = value;} }}
现在我们将在服务端和客户端使用它们。
服务端如下:
public class Server
{ public static int Main(string [] args) {TcpChannel chan1 = new TcpChannel(8085);
HttpChannel chan2 = new HttpChannel(8086);ChannelServices.RegisterChannel(chan1);
ChannelServices.RegisterChannel(chan2); RemotingConfiguration.RegisterWellKnownServiceType (typeof(HelloServer), "SayHello", WellKnownObjectMode.Singleton); //创建类的实例System.Console.WriteLine("Press Enter key to exit");
System.Console.ReadLine(); return 0; }客户端如下:
public class Client
{ public static void Main(string[] args) { //使用HTTP通道得到远程对象 HttpChannel chan2 = new HttpChannel(); ChannelServices.RegisterChannel(chan2); HelloServer obj1 = (HelloServer)Activator.GetObject( typeof(RemotingSamples.HelloServer), "创建类的实例 if (obj1 == null) { System.Console.WriteLine( "Could not locate HTTP server"); } Console.WriteLine( "Client1 TCP HelloUserMethod {0}", obj1.HelloUserMethod(new User("张生",true))); //将类作为参数(将User作为参数必须是serializable) }}
}