2009-11-25 58 views
0

想象一下,我已經有了一個在OO模型中有意義的數據對象,但是對於序列化,我希望它的字段引用其他類型替換爲簡單的ID,或者一些情況下,一個帶有文本和ID的簡單對象。在使用WCF序列化時爲集合使用不同的類型

是否有可能讓序列化程序以不同方式處理特定字段,還是必須重新定義第二個數據對象類從頭開始使用簡化字段並使用它?

例子:

Person 
    Guid Id 
    string Name 
    List<Person> Siblings 

我想做什麼連載:

Person 
    Guid Id 
    string Name 
    List<Guid> Siblings 

我想只有一個班,Person,並定義爲我服務的序列化行爲(最好不在數據類型級別,因爲它可以作爲XML或JSON序列化)。我知道在WCF中對引用的支持,但在這種情況下,我將引用結果集中其他地方未包含的其他類型;我只想包括他們的ID。

回答

1

你可以從你的序列excludeSiblings財產,並添加只讀SiblingGuids

Person 
    Guid Id 
    string Name 
    [NonSerialized] 
    List<Person> Siblings 
    List<Guid> SiblingGuids // Only a getter which will expose guids 
+0

即使它不是理想的,我仍將繼續使用這個解決方案(通常,我不想讓屬性返回值需要創建一個對象 - 在本例中爲'List' - 當檢索時)。 – Blixt

1

一旦您更改了正在傳輸的信息的結構,數據傳輸對象可能是最乾淨和最簡單的選擇。

事實上,我會總是建議爲WCF服務創建專用的DTO,以分離服務和它從我通常針對的域模型傳輸的數據。管理模型和服務變更的開銷是分開的,但它比僅僅將域對象強制爲適合你的服務的形狀,然後試圖將它們保留在那裏的工作要少得多。

+0

我明白了。我不想強制域對象符合我的WCF服務,但我希望它們完全不受與服務相關的任何事情的影響。我想要的是一種「繼承」域對象結構的方法,只處理一些特定的案例(引用列表),這樣我就不會有太多的開銷。 – Blixt

+0

我不認爲我足夠了解這個問題。你能做任何事情來澄清你的問題嗎? –

+0

嗯......我想要做我想做的事情的唯一方法是爲序列化程序調用集合中每個項目的回調函數。回調會返回一個只有我想要的值的對象,該值將被序列化並放入序列化集合中。所以基本上,對於Siblings集合,序列化程序會爲每個Person實例調用回調函數,而回調函數會返回一個Guid值。這樣我不需要額外的類,並且我得到了我想要的序列化結構。這可能與WCF? – Blixt

相關問題