2009-06-21 98 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接口時開始考慮消息傳遞而不是對象,否則你會遇到很多這樣的問題。