2010-12-04 25 views
3

我正在讀reference page哪些類型可由WCF序列化,並且它對哪些類型是自動KnownType不明確,哪些不是。任何人都可以對此有所瞭解嗎?例如,如果我的DataContract有一個Object類型的成員,那麼如果我傳遞一個字符串,它將會很好地序列化,但如果我傳遞一個Dictionary,則不會。字典將需要一個KnownType,儘管在該頁面中被提及爲支持。有了這個我有兩個問題:找出對象的實例是否是WCF中的DataContract可序列化的

  1. 所以問題是,什麼是自動KnowType WCF總是使用?

  2. 我需要的代碼將確定如果默認情況下對象的實例是KnownType。一種解決方案是從1的答案中提出一個詳盡的列表,然後用「obj is type」語句檢查每個對象,但這似乎是一個糟糕的實現。有更聰明的方法嗎?

編輯:

reference列出了默認情況下知道的類型。所有原語少於DateTimeOffset加XmlElement。所以只剩下兩個:如果一個對象是原始類型,我怎麼知道?

編輯2: typeof(obj).IsPrimitive將完成大部分工作!

回答

1

當操作契約簽名中只有基類型可見時,需要一個已知類型,但可以返回一些派生類型。例如:

[OperationContract] 
BaseClass Foo(); 

並在實施:

public Foo() 
{ 
    return DerivedClass(); 
} 

其中DerivedClassBaseClass導出。所以,你需要在BaseClass聲明中顯式指定此兩種:

[KnownType(typeof(DerivedClass))] 
[DataContract] 
public class BaseClass { } 

或使用[ServiceKnownType]在服務合同聲明:

​​3210

或使用配置文件:

<system.runtime.serialization> 
    <dataContractSerializer> 
     <declaredTypes> 
      <add type="SomeNs.BaseClass, SomeAssembly"> 
       <knownType type="SomeNs.DerivedClass, SomeAssembly"/> 
      </add> 
     </declaredTypes> 
    </dataContractSerializer> 
</system.runtime.serialization> 

更新:

由於文檔指出它,你不需要這個基本類型:

內置到 .NET Framework中的下列類型都可以被序列化 ,被認爲是原始 類型:字節,爲SByte ,Int16,Int32, Int64,UInt16,UInt32,UInt64,Single, Double,Boolean,Char,Decimal, Object和String。

+0

您至少有部分錯誤。 KnownType也用於其他目的。例如,如果我不爲Dictionary 添加KnownType,我會得到序列化異常。你也沒有回答我的兩個問題:-(我是低調的,但是如果你編輯答案來真正解決我的問題,我會再回來。再一次,我不會問關於KnownType的作用。 – 2010-12-04 19:50:42

相關問題