zoukankan      html  css  js  c++  java
  • C# MarshalByRefObject 和Serializable的区别

    这两种方式的类一般都是用于远程传输时使用。

    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),
                    "http://localhost:8086/SayHello");//创建类的实例
                if (obj1 == null)
                {
                    System.Console.WriteLine(
                        "Could not locate HTTP server");
                }
                Console.WriteLine(
                    "Client1 TCP HelloUserMethod {0}",
                    obj1.HelloUserMethod(new User("张生",true))); //将类作为参数
    (将User作为参数必须是serializable)                   }

     }

     }

  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/ChineseMoonGod/p/6121356.html
Copyright © 2011-2022 走看看