Remoting与Font对象

  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对象了。这种方案是可行的,只是使得接口方法的定义变得不那么直观了。还有更好的办法吗?欢迎留言。

 

 

 

 

posted @ 2010-09-01 11:46  WebIM--网页即时通讯  阅读(943)  评论(1编辑  收藏  举报