2011-05-31 38 views
1

有關WCF中DataContract(s)的數千個問題,特別注意涉及繼承的情況。 但是我沒有找到任何關於特定情況的例子,這些例子都是我在這裏提供的一個概述。WCF中涉及DataContract的複雜情況

考慮應用於在WCF服務通信使用的類型下面DataContract(代碼1)

// Data contract for my comm type 
[DataContract] 
public class MyCommsType { 
    [DataMember] 
    public Type1 field1; 
    [DataMember] 
    public Type2 field2; 
    [DataMember] 
    public Type1 field3; 
    [DataMember] 
    public Type2 field4; 
    [DataMember] 
    public List<Type2> field5; 
    [DataMember] 
    public List<Type1> field6; 
} 
// Used types 
public class Type1 { 
    ... 
} 
public class Type2 { 
    ... 
} 

該類型應該是這裏使用(代碼1.1)

[ServiceContract] 
public interface IMyService { 
    [OperationContract] 
    string CommOp1(MyCommType mct); 
    [OperationContract] 
    MyCommType CommOp2(string s); 
} 

我的個人類型MyCommsType是一種涉及通信類型。但是,當然,CLR不知道如何序列化它,因爲它不是基類庫中的本地類型。 MyCommsType需要數據合同,所以我提供了它。然而,這種藝術狀態並不足以讓事物發揮作用(沒有任何工作是這樣的)。

爲什麼不行?是因爲在我的MyCommsType裏面有未知類型?

那麼,我應該做以下(代碼清單2)

// Data contract for my comm type 
[DataContract] 
[KnownType(typeof(Type1))] 
[KnownType(typeof(Type2))] 
[KnownType(typeof(List<Type1>))] 
[KnownType(typeof(List<Type2>))] 
public class MyCommsType { 
    [DataMember] 
    public Type1 field1; 
    [DataMember] 
    public Type2 field2; 
    [DataMember] 
    public Type1 field3; 
    [DataMember] 
    public Type2 field4; 
    [DataMember] 
    public List<Type2> field5; 
    [DataMember] 
    public List<Type1> field6; 
} 

是否正確????

但是,如果它是正確的,如何在CLR知道如何序列Type1Type2 ????? 我從未爲這兩種類型添加過屬性? 我必須把[Serializable]如圖所示(代碼清單3)

// Used types 
[Serializable] 
public class Type1 { 
    ... 
} 
[Serializable] 
public class Type2 { 
    ... 
} 

如何處理這種情況?

,使其更簡單(回答)考慮以下問題:

1)是否代碼1徹底解決問題的序列化?

1a)如果沒有,那麼,如何處理這個問題?

2)在情況1)是好的,如何處理Type1Type2的序列化問題? [Serializable]應用程序是否解決?

回答

4

您的問題可以用更簡單的方法解決。

無論您使用何種類型,您只需將其設置爲可序列化即可。更簡單的解決方案是讓你的子類自己作爲數據合約。

例如,如果你有

// Data contract for my comm type 
[DataContract] 
public class MyCommsType {  
[DataMember]  public Type1 field1;  
[DataMember]  public Type2 field2;  
[DataMember]  public Type1 field3;  
[DataMember]  public Type2 field4;  
[DataMember]  public List<Type2> field5;  
[DataMember]  public List<Type1> field6; 
} 

確保Type1和Type2是Datacontracts。這就是你需要做的。

[DataContract] 
public class Type1 {...} 

[DataContract] 
public class Type2 {...} 

如果您正在做任何類型的Inherence,那麼您可能需要放置KnownType屬性。否則,只要將子類型(Type1和Type2)保留爲Datacontracts即可。

+1

+1。這是我通常所做的;只是做一切(在這種情況下,type1和type2)也是一個DataContract。 – CodingWithSpike 2011-05-31 17:16:10