2010-11-10 89 views
12

我有一個包含一些對象的公共庫。然後我有一個服務項目引用公共庫,並從公共庫中的對象創建一些派生類型。如何使用WCF將派生類型序列化爲其基類型

我希望我的服務能夠將派生類型序列化爲公共庫中定義的基類型。

我不能在公用庫中的對象上使用KnownTypes,因爲我不想公用庫引用服務程序集。

那麼我怎樣才能讓wcf序列化派生類型作爲它們的基類型?

希望我可以做這樣的事情......

[DataContract(SerializeAsType = typeof運算(基本類型))] 公共類DerivedType:BASETYPE {}

是這樣子可能什麼?

回答

3

您使用的是.NET 4.0嗎?

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractresolver.aspx

這也基本上是實體框架4.0確實爲它的DataContractResolver的代理類型:如果你可以使用DataContractResolver這一點。

下面是一個例子: http://blogs.msdn.com/b/youssefm/archive/2009/06/05/introducing-a-new-datacontractserializer-feature-the-datacontractresolver.aspx

(參見DeserializeAsBaseResolver中的鏈接)。

編輯: 如果您不使用.NET 4.0,我認爲您的下一個最佳選擇是DataContractSurrogate:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx。 ...所以你可以手動控制序列化,但這會變得混亂。

兩者都傳遞到DataContractSerializer的構造函數中,並且可以通過DataContractSerializerOperationBehavior爲WCF進行配置:http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx

+0

我使用的是3.5,所以我不得不去使用代理選項......它運行得非常好!謝謝 – Dannerbo 2010-11-10 17:53:52

6

我們剛剛通過設置繼承類[DataContract(Name =「BaseClass」)]「解決了」這個問題。即使繼承類是內部的並且在另一個項目中定義,它也可以工作。

希望它有幫助。

+0

嗨,marc。這是你做的嗎?我們可以有一個更完整的例子嗎? – Xiaofu 2011-06-02 08:23:27

+0

是的,這就是所有需要做的。只需將合同重命名爲基類的名稱即可。 – marc 2011-06-28 07:26:16

+0

+1對我來說,這是迄今爲止最簡單的解決方案。它的一個工作班輪。 DataContractResolver方法很長,涉及類和插入解析器服務器主機等。它唯一的補救功能是,您可以通過方法基礎控制合同方法的行爲 - 此名稱=解決方案適用於此對象的所有傳輸實例在我的情況下是可以的)。 – Ricibob 2011-12-07 11:31:49

相關問題