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)                   }

     }

     }

  • 相关阅读:
    mysql function 与 procedure
    mysql存储过程详解
    mysql的过程和Oracle的区别
    ext combobox getValue
    tar + find
    精确到秒的JQuery日期控件
    SQL中not and or优先级问题
    sql生成一个唯一标示
    Guid.NewGuid().ToString()的几种格式 (转)
    win10怎样彻底关闭windows Defender
  • 原文地址:https://www.cnblogs.com/ChineseMoonGod/p/6121356.html
Copyright © 2011-2022 走看看