WCF DataContract Upcasting

时间:2009-06-21 20:52:04

标签: wcf casting datacontract

我正在尝试接收我在服务器上收到的datacontract对象,对它进行一些操作,然后返回它的上传版本,但它似乎不起作用。我可以通过使用KnownType或ServiceKnownType属性来使其工作,但我不想往返所有数据。以下是一个例子:

[DataContract]
public class MyBaseObject
{
    [DataMember]
    public int Id { get; set; }
}

[DataContract]
public class MyDerivedObject : MyBaseObject
{
    [DataMember]
    public string Name { get; set; }
}


[ServiceContract(Namespace = "http://My.Web.Service")]
public interface IServiceProvider
{
    [OperationContract]
    List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects);
}

public class ServiceProvider : IServiceProvider
{
    public List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects)
    {
        ... do some work ...

        myDerivedObjects[0].Id = 123;
        myDerivedObjects[1].Id = 456;
        myDerivedObjects[2].Id = 789;

        ... do some work ...

        return myDerivedObjects.Cast<MyBaseObject>().ToList();
    }
}

任何人都有任何想法如何在不重新创建新对象或使用KnownType属性的情况下使其工作?

4 个答案:

答案 0 :(得分:0)

我认为您的问题是您尝试发送通用列表。

如果将列表封装在对象中,它将起作用。那就是创建一个具有单个公共属性的对象,这是一个通用列表。

您还需要确保合同中未直接使用的所有类都标记为可序列化。

答案 1 :(得分:0)

如果要返回派生对象,则始终会有往返,因为客户端和服务是分开的。为了让客户端更新自己的MyBaseObjects列表,它必须反序列化来自服务器的MyDerivedObjects列表。

需要使用KnownType和/或ServiceKnownType,因为这会导致将该类型信息添加到WSDL中,而客户端又将其用于将消息反序列化为正确的类型。

对于初学者来说,这是一个用于测试您所描述的场景的有用工具:http://www.wcfstorm.com

答案 2 :(得分:0)

您可以尝试创建DataContractSurrogate(IDataContractSurrogate)并返回基本类型以调用GetDataContractType。我不太确定它是如何被使用的,所以你仍然可以更好地使用“额外的工作”,但也许我不理解这项额外工作的范围。

答案 3 :(得分:0)

WCF(和.net远程处理)的一个问题是它们试图使“消息传递”看起来像方法调用。

当您尝试使用太多“oop”类型的设计时,这个倒下了。

  

消息是这样的事实   由.net类表示,   使所有行为像.net一样   类。

请参阅thisthis,了解有关泄漏抽象问题的更多信息。

所以你需要在设计WCF接口时开始考虑消息传递而不是对象,否则你会遇到很多这样的问题。