有關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知道如何序列Type1
和Type2
????? 我從未爲這兩種類型添加過屬性? 我必須把[Serializable]
如圖所示(代碼清單3)?
// Used types
[Serializable]
public class Type1 {
...
}
[Serializable]
public class Type2 {
...
}
如何處理這種情況?
,使其更簡單(回答)考慮以下問題:
1)是否代碼1徹底解決問題的序列化?
1a)如果沒有,那麼,如何處理這個問題?
2)在情況1)是好的,如何處理Type1
和Type2
的序列化問題? [Serializable]
應用程序是否解決?
+1。這是我通常所做的;只是做一切(在這種情況下,type1和type2)也是一個DataContract。 – CodingWithSpike 2011-05-31 17:16:10