当我在Remoting中用到一个从DataSet或DataTable继承的类时,在客户端报出找不到反序列化方法的错误,有什么办法能解决吗?

解决方案 »

  1.   

    加了,但是在Remoting的客户端说找不到反序列化方法,类是这样定义的:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;namespace Microsoft.Samples.SharedInterface
    {
    [Serializable]
    public class BusinessEntity : DataSet 
    {
    public BusinessEntity()
    {
    DataTable dt = new DataTable();
    dt.Columns.Clear();
    dt.Columns.Add(new DataColumn("CustomerName", typeof(string)));
    dt.Columns.Add(new DataColumn("CustomerBirthday", typeof(DateTime)));
    DataRow dr = dt.NewRow();
    dr[0] = "bvw";
    dr[1] = DateTime.Now;
    dt.Rows.Add(dr);
    this.Tables.Add(dt);
    }
    public string CustomerName
    {
    get { return this.Tables[0].Rows[0][0].ToString(); }
    } public DateTime CustomerBirthday
    {
    get { return (DateTime)this.Tables[0].Rows[0][1]; }
    }
    }
    }
      

  2.   

    客户端是这样用的:
    ISharedInterface remoteObject = (ISharedInterface)Activator.GetObject(typeof(ISharedInterface), "tcp://localhost:8080/server.rem");
    BusinessEntity entity = remoteObject.GetEntity();
    Console.WriteLine("Customer's Name is: {0}, birthday is: {1}", entity.CustomerName, entity.CustomerBirthday.ToLongDateString());另外用到了一个接口IShareInterface:
    BusinessEntity GetEntity();
    其实现类中的方法:
    public class ImplementationClass : MarshalByRefObject, ISharedInterface
    {
    public BusinessEntity GetEntity()
    {
    return new BusinessEntity();
    }

    错误如下:
    The constructor to deserialize an object of type 'Microsoft.Samples.SharedInterface.BusinessEntity' was not found.
      

  3.   

    加了DataSet就变成了组件类,我也碰到过你的问题,不过由于时间关系,没有细研究下去。最后还是改为has的关系,而不是继承的is的关系。由于C#不支持多重继承,所以BusinessEntity 继承了DataSet就不能再使用MarshalByRefObject,而这时的BusinessEntity ,只能在Server端做初始化,所有的方法执行都在本地执行。所以干脆就只在构造函数内提取所需要所有数据,然后再传给Client进行处理,DataSet成为一个类性属性。
      

  4.   

    谢谢 gzlucky(Lucky)虽然将DataSet作为类的属性是可以,但如果这样的话,作为实体类的BusinessEntity就不是那么直观了,因为我原来WebService时这样是可以的。
    DataSet本身是从MarshalByValObject继承的,也应该是可以的啊,而且,在WebService中使用同样的类没有问题,只是在Remoting 中才出问题。
      

  5.   

    是不是从DataSet继承的类,加上Serialize属性后只支持Xml格式的序列化而不支持Binary格式的序列化?
      

  6.   

    你可以看通过vs.net生成的强类型的DataSet,的原代码,按照他的写就没有问题了。
      

  7.   

    你这序列化不只是只读属性的,你需要序列化成XML 然后用XMLIngore标签来标示只读属性才可以。请详细参考MSDN有关序列化的知识。不是一个简单的[Serializable]就能搞定的
      

  8.   

    谢谢各位,我找到原因了,是因为BusinessEntity中没有反序列化的构造方法,我添加了
    protected BusinessEntity(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context)
    {}就可以了