2009-06-21 102 views
1

我想拿一个我在服务器上收到的datacontract对象,对它做一些操作,然后返回它的升级版本,但它似乎没有工作。我可以通过使用KnownType或ServiceKnownType属性来使其工作,但我不想将所有数据往返。下面是一个例子:WCF DataContract Upcasting

[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属性工作?

回答

0

我认为你的问题是你试图发送一个通用列表。

如果你将列表封装在一个对象中,它会起作用。这是创建一个对象与一个单一的公共财产,这是通用名单。

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

+0

IList发送得很好。这是当我尝试向上转换不起作用的对象时。我不想将所有数据往返。 – 2009-06-26 01:14:06

+0

您可以尝试使用自定义映射代码或接口。 – 2009-06-26 12:11:21

0

如果你想返回派生对象,那么总会有一个往返行程,因为客户端和服务是分开的。为了让客户端更新自己的MyBaseObjects列表,它必须反序列化来自服务器的MyDerivedObjects列表。

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

对于初学者来说,测试你所描述的情况下一个有用的工具:http://www.wcfstorm.com

0

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

0

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

当你尝试使用太多的“oop”型设计时,会下降。

,该消息是由.NET类代表 事实上,确实 让他们所有的行为像.NET 类。

有关泄漏抽象问题的更多信息,请参见thisthis

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