当前位置: 首页 > news >正文

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

 }

 }

相关文章:

  • qcow2
  • GitHub 上 57 款最流行的开源深度学习项目
  • Databricks Scala 编程风格指南
  • topsec***检测系统规则库手动升级
  • tomcat配置
  • 启动Hadoop HA Hbase zookeeper spark
  • tar 命令详解
  • mfs详解及数据备份方式
  • IOC个人理解
  • MSG结构体和WndProc窗口过程详解
  • SDWebImage源码解读 之 UIImage+GIF
  • 第一次给ThinkPHP5核心框架提pull request的完整过程
  • ambari2.0.0,hadoop2.6重启namenode报错
  • Github入门
  • mysql root密码忘记
  • ES6系列(二)变量的解构赋值
  • ESLint简单操作
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript设计模式与开发实践系列之策略模式
  • Java精华积累:初学者都应该搞懂的问题
  • js面向对象
  • js中forEach回调同异步问题
  • Lucene解析 - 基本概念
  • MQ框架的比较
  • TCP拥塞控制
  • 初识 webpack
  • ------- 计算机网络基础
  • 记录:CentOS7.2配置LNMP环境记录
  • 聊聊sentinel的DegradeSlot
  • 使用agvtool更改app version/build
  • 数据可视化之 Sankey 桑基图的实现
  • 译米田引理
  • 源码安装memcached和php memcache扩展
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 字符串匹配基础上
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​MySQL主从复制一致性检测
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #Linux(Source Insight安装及工程建立)
  • #stm32驱动外设模块总结w5500模块
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)字符分类函数
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四) 虚拟摄像头vivi体验
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)LINQ之路
  • .equals()到底是什么意思?
  • .NET DataGridView数据绑定说明