none
在WCF协议中传继承类的对象的问题 RRS feed

  • 问题

  • 不知道题目有没有说清楚。

    总之看代码吧。

    [DataContract]
    public class Person
    {
        [DataMember]
        public int id;
        [DataMember]
        public int name;
    }

    然后我有一个继承类:

    [DataContract]
    public class Manager : Person
    {
        [DataMember]
        public int level;
    }

    接口如下:

    [ServiceContract]
    public interface Server
    {
        [OperationContract]
        bool GetPerson(ref Person p);
    }

    客户端这样调用:

    Person p = new Person();
    client.GetPerson(ref p);


    现在问题来了!服务器端只有一个对象,是个Manager类型的

    Manager mgr = new Manager();    // 大体如此。

    // 以下空行分开的是好几种情况。
    public bool GetPerson(ref Person p)
    {
        p = mgr;        // 出错
        p = (Person)p;  // 出错
       
        Person np = new Person();
        p = np;         // 这样正常

        p.id = mgr.id;
        p.name = mgr.name;    // 这样也正常
    }

    错误信息:
    读取操作失败,请参见内部异常。
    套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网

    络资源问题导致的。本地套接字超时是“00:00:59.5310000”。


    我测试了几次,现在觉得问题是这样的:
    接口需要一个Person对象,而我给了一个Manager对象,于是在数据序列化的时候有问题了。
    难道我一定要去给传回的Person对象每个字段手工赋值?
    实际应用中这是一个很大的工作量啊。

    还是去写一个Person Manager.GetPerson();这样的函数?

     

    在应用中,问题是可以解决的(或者说绕过去)
    但是我想问一下我的理解到底有没有错。
    另外这个问题有没有比较优雅的解决办法?

    2009年11月6日 7:06

答案

  • 在Person类上注明KnownTypeAttribute,或者在GetPerson操作上注明ServiceKnownTypeAttribute.

    类似这样:

    [DataContract]
    [KnownType(typeof(Manager))]
    public class Person
    {...}

    或:

    [OperationContract]
    [ServiceKnownType(typeof(Manager)]
    bool GetPerson(ref Person p);
    • 已标记为答案 Maksheiev 2009年11月6日 7:34
    2009年11月6日 7:24

全部回复

  • 在Person类上注明KnownTypeAttribute,或者在GetPerson操作上注明ServiceKnownTypeAttribute.

    类似这样:

    [DataContract]
    [KnownType(typeof(Manager))]
    public class Person
    {...}

    或:

    [OperationContract]
    [ServiceKnownType(typeof(Manager)]
    bool GetPerson(ref Person p);
    • 已标记为答案 Maksheiev 2009年11月6日 7:34
    2009年11月6日 7:24
  • 傻了。看过的东西不记得了。

    半路出家问题多多啊。
    2009年11月6日 7:34
  • 我刚才试了一下,好像不添加attribute也不影响数据获取,是不是我的理解有问题呢?

     

    如果我有一个Boss,继承了Manager,拿着两个特性加在哪里呢

    是不是

    [DataContract]
    [KnownType(typeof(Manager))]

    [KnownType(typeof(Boss))]
    public class Person

    还是

    [KnownType(typeof(Boss))]
    public class Manager

     

    2010年3月24日 10:35