2009-03-03 36 views
6

我知道一個私有的無參數構造函數,但是沒有無參數構造函數的對象呢?是否有可能序列化WCF中沒有無參數構造函數的對象?

我想暴露第三方庫的類型,所以我無法控制類型定義。

如果有什麼方法是最簡單的?例如。我不需要創建子類型。

編輯:

我正在尋找的是類似這裏顯示的自定義級別:http://msdn.microsoft.com/en-us/magazine/cc163902.aspx 雖然我不希望有訴諸流序列化/反序列化。

回答

5

你真的不能任意類型的序列化;在某些情況下(例如,XmlSerializer),運行時會公開欺騙屬性的選項。但DataContractSerializer不允許這樣做。可行的方案:

  • 隱藏類自己的類型是序列化(大量的工作)
  • 提供二進制格式化代理人(yeuch)
  • 寫自己的序列化的核心(大量的工作背後得到正確的)

本質上說,如果事情是不設計系列化,很少框架將你序列化它。

1

我不是WCF專家,但它不太可能支持任意類型的構造函數的序列化。就是因爲他們會傳遞什麼價值觀?您可以傳遞null作爲參考類型,併爲結構傳遞空值。但是,一個類型可以用完全空的數據構造出什麼好?

我覺得你被卡住1 2的選項

  1. 子類類型的問題,並通過適當的默認值,非參數的構造函數
  2. 創建存在負全部序列化一個類型。一旦完成,它可以創建一個你感興趣的原始類型的實例。它是一個橋樑。

就我個人而言,我會去#2。使該類成爲僅數據結構並針對序列化和工廠目的進行優化。

+0

問題在於庫中有很多類型,我必須將所有類型映射到第三方庫中的一部分類型。 – 2009-03-03 06:04:25

1

我只是運行一個小測試,使用WCF服務返回一個沒有默認構造函數的基本對象。

//[DataContract] 
//[Serializable] 
public class MyObject 
{ 
    public MyObject(string _name) 
    { 
     Name = _name; 
    } 

    //[DataMember] 
    public string Name { get; set; } 

    //[DataMember] 
    public string Address { get; set; } 
} 

這裏的服務是什麼樣子:

public class MyService : IMyService 
{ 
    #region IMyService Members 

    public MyObject GetByName(string _name) 
    { 
     return new MyObject(_name) { Address = "Test Address" }; 
    } 

    #endregion 
} 

這實際工作,只要爲MyObject要麼是[DataContract]或[Serializable接口。有趣的是,它似乎並不需要客戶端的默認構造函數。有一個相關的帖子在這裏:

How does WCF deserialization instantiate objects without calling a constructor?

+0

不幸的是,第三方框架類型既沒有被標記爲[DataContract],也沒有被標記爲[Serializable]。 – 2009-03-03 06:05:26

+0

這意味着它們不是被設計爲序列化的,所以不要序列化它們。 – 2009-03-03 14:59:41

相關問題