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