• Remoting与Font对象 WebIM


      Remoting与Font对象有何牵连了?这是因为System.Drawing.Font这个类型比较特殊。它既添加了[Serializable]特性,表明其支持序列化;又从MarshalByRefObject继承,表明其可以被远程Remoting引用。

    [Serializable]
    public sealed class Font : MarshalByRefObject

      假设有个TextView类型的对象中有Font类型的成员,比如像下面这样:

    [Serializable]
    public class TextView
    {
      
    private string content = "";
    public string Content
    {
    get { return content; }
    set { content = value; }
    }
        private Font font = new Font("宋体", 9); 
    public Font Font
    {
    get { return font; }
    set { font = value; }
      }
     }

      TextView是标记为[Serializable]特性而没有从MarshalByRefObject继承,表明其可以被序列化传递而不能被远程Remoting引用。

      

      好,现在问题来了,假设有个Remoting接口可以获取TextView对象:

    public interface IViewGetter
    {
      TextView GetTextView(
    intviewID);
    }

      当我得到IViewGetter接口的远程引用,并调用其GetTextView方法时,返回的TextView对象中的font成员是指向一个本地对象了?还是这个font成员本身就是一个remoting引用?

      经过我的测试,此时font成员是一个remoting引用,它是服务器上真实的Font对象的一个代理而已。

      很多时候,这并不是我们所期望的,毕竟,我们只是想得到一个“纯的”本地的TextView对象,那么如何解决这个问题了?我的方法是这样的 -- 修改IViewGetter接口的GetTextView方法,让其返回TextView对象序列化后得到是字节数组,即这样:

    public interface IViewGetter
    {
      byte[] GetTextView(
    intviewID);
    }

      客户端调用GetTextView方法得到结果后,将其反序列化为TextView对象,如此客户端得到的就是一个“纯的”本地的TextView对象了。这种方案是可行的,只是使得接口方法的定义变得不那么直观了。还有更好的办法吗?欢迎留言。

  • 相关阅读:
    7.5_链表_链表中添加结点
    【链表】创建新结点
    【单链表】头插法 & 尾插法
    7.5_链表_添加元素_尾插法/头插法
    7.5_链表_创建链表
    7.4_结构体_返回结构体的函数
    通俗的理解一下生成式对抗网络(GAN)
    Linux中如何让进程(或正在运行的程序)到后台运行?
    anaconda搭建本地源(加速访问),内网源(无外网访问)
    Ubuntu18.04(16和14也可以) 安装独立显卡后开机黑屏
  • 原文地址:https://www.cnblogs.com/components/p/1814712.html
Copyright © 2020-2023  润新知