2011-03-03 68 views
0

我正在開發一個項目,我想通過Web服務從數據庫中發送一個實體。如何序列化生成的類?

我把這作爲我的數據合同。

[DataContract] 
public class CreateAlumniRequest 
{ 
    [DataMember] 
    public List<Alum.Data.EmploymentHistory> lstEmploymentHistory; 
} 

但是,我不斷收到此錯誤。

類型 'Alum.Data.Base.EmploymentHistoryBase' 無法序列。請考慮使用DataContractAttribute 屬性標記 ,並使用 DataMemberAttribute屬性標記要與其序列化的所有成員 成員。如果 類型是一個集合,請考慮將其與 CollectionDataDataContractAttribute標記爲 。

這告訴我我可能需要去EmploymentHistory類並將其標記爲DataContract。

問題是EmploymentHistory是由一個內部ORM工具生成的 - 我無法真正對其進行任何更改。

是否有可能在不添加該屬性的情況下序列化EmploymentHistory?

有沒有其他解決方案?我能想到的唯一辦法是在可序列化的類中重新創建EmploymentHistory並手動映射對象,這聽起來像很多重複。

回答

1

我不確定你試圖使用哪個序列化器,但是如果Alum.Data.EmploymentHistory不能被序列化,因爲它沒有被標記爲可序列化或者其他原因......應該能夠恰到好處點擊它並提取界面。使用重構菜單創建一個類來實現接口,並在成員上實現{get; set;}。然後,您可以使用automapper來映射數據。

它聽起來很像,但它實際上會很快......並且會避免所有的手動映射。即使你不使用automapper,它絕對值得一看。有很多情況下需要將數據從一個對象複製到另一個對象......「AssertConfigurationIsValid」使測試映射變得容易。如果你的數組或列表或任何類型的嵌套對象的東西都是自動處理的...非常酷...檢查出來。

+0

這可能是我必須要做的。我只是不喜歡這樣一個事實,即如果EmploymentHistory發生變化,我將不得不記住重新映射變量。 – Diskdrive 2011-03-03 03:59:48

0

如果您的codegenerator創建了部分類,您可以將缺少的屬性添加到新的部分文件中。

如果不是 ,您可以嘗試使用不同的開源串行器,如SharpSerializerprotobuf-net

+0

您可以使用此方法添加接口實現,但不能將屬性添加到已生成文件中已聲明的屬性。這就是爲什麼DataAnnotations爲我們提供了buddy-class方法,我認爲這不是WCF支持的方法。但是,仍然可以創建一個包含生成文件中定義的所有屬性的接口,然後將其應用於部分類中。 – 2011-03-03 08:45:15

+0

對於可序列化類型,[DataContract]屬性不是必需的,但WCF顯然遇到了EmploymentHistory類的一部分或屬性,它可能無法序列化。在這種情況下,某些屬性將需要[DataMember]。 – 2011-03-03 08:51:50

+0

@J。提洪:tnx的信息。我更新了我的回答 – k3b 2011-03-03 09:03:23