那为什么还要求[Serializable]序列化?

解决方案 »

  1.   

    “直接”操纵远端的那个object其实是远端序列化这个对象后发给你,你在本地反序列化后操作,操作完了再发给远端,和java的rmi一样,和你aspx页面的传送也是一样的道理,只不过它的序列化和反序列化由dotnet平台替你做了
      

  2.   

    是的,这个序列化可以建立一个服务器的对象的一个deep copy。
      

  3.   

    那么如果像我的例子那样有hashtable,并且里面加入了很多其他对象,那么这整个一串对象都会在客户端序列化么?
      

  4.   

    比如
    RemoteObject类含有一个方法 public HashTable FuncA(),当我们调用它时,是不是在客户端的内存中建立一个 HashTable 实例,与服务器创建的 HashTable 完全一样的(此Hashtable包含的对象实例同时也在客户机上创建)? 
      

  5.   

    Remoting的实现是在服务器端,在客户端只是有一个代理也就是说在客户端调用时,客户端只是做一个简单的转发,把该调用转发给服务器服务器处理完后返回序列化的概念是把一个对象保存成可存储的数据,在需要的时候根据这些数据就可以
    重构一个类似的对象 public HashTable FuncA(),HashTable是可以序列化的,客户端可以建立,但是这个
    序列化过程有没有把HashTable里面的内容也序列化了呢?如果序列化了,但是其中
    有无法序列化的对象的话,那这个对象也是不可序列化的
      

  6.   

    有点明白了,MarshalByRefObject的对象会在客户端建立一个代理,负责转发消息,这个类可以不必序列化;而转发的消息,也就是方法的参数或者方法的返回值,是必须序列化的。也就是说,如果上例方法中有一个hashtable参数或返回值,那么hashtable中加入的所有对象也都必须是序列化的。不知这样理解对不对?
      

  7.   

    对的,不过方法的参数或者方法的返回值也可以是MarshalByRefObject的对象
      

  8.   

    当方法的参数或者方法的返回值是MarshalByRefObject的对象时,传递的是对象的引用,即并没有在客户端创建一个copy实例,而是直接操纵服务器的对象。那么如果这个对象同时也是可序列化的呢?
      

  9.   

    是啊,如果这个类既按值封送,又按引用封送,会怎么样呢
    [Serializable]
    class RemoteObject: MarshalByRefObject
      

  10.   

    [C#]
    [Serializable]
    public abstract class MarshalByRefObject这个本来就是可以序列化的,不过它Marshal的是接口以及通讯的一些参数(用于建立
    代理用)