2010-04-15 72 views
2

我有一個簡單的類如果我沒有編寫用於實例化對象的類,我可以序列化一個對象嗎?

[Serializable] 
public class MyClass 
{ 
    public String FirstName { get; set: } 
    public String LastName { get; set: } 

    //Bellow is what I would like to do 
    //But, it's not working 
    //I get an exception 
    ContactDataContext db = new ContactDataContext(); 

    public void Save() 
    { 
    Contact contact = new Contact(); 
    contact.FirstName = FirstName; 
    contact.LastName = LastName; 

    db.Contacts.InsertOnSubmit(contact); 
    db.SubmitChanges(); 
    } 
} 

我想一個保存方法附加到類,這樣我可以把它的每個對象。當我介紹了其中包含ContactDataContext上面的語句,我得到了下面的錯誤「在組裝......公鑰=空」未標記爲可序列

很明顯,DataContext類是由框架生成()。我查了一下,沒有看到那個班的標記是serialize

我能做些什麼來克服這一點?當我不是班級的作者時,規則是什麼? 只要繼續並將DataContext類標記爲可序列化,並假裝一切都會工作?

感謝您的幫助

回答

1

問題是db字段被序列化,顯然它不需要被序列化(一旦對象被創建,它就會被實例化)。

[NonSerialized] 
ContactDataContext db = new ContactDataContext(); 

[更新]

爲了確保db場是對象初始化後accesable,你應該使用lazy loading property及用途:

因此,您應該用NonSerialized屬性裝飾它此屬性替代該字段:

[NonSerialized] 
ContactDataContext db = null; 

[NonSerialized] 
private ContactDataContext { 
    get { 
     if (db == null) { 
      db = new ContactDataContext(); 
     } 
     return db; 
    } 
    set { 
     db = value; 
    } 
} 

public void Save() 
{ 
    Contact contact = new Contact(); 
    contact.FirstName = FirstName; 
    contact.LastName = LastName; 

    Db.Contacts.InsertOnSubmit(contact); 
    Db.SubmitChanges(); 
} 

[UPDATE2]

可以序列大多數對象,只要它有一個公共的無參數的構造函數(或者沒有構造在所有),並不能序列化,但需要序列化沒有屬性/字段。如果課程本身沒有標記爲[Serializable],那麼您可以使用部分課程自行完成。如果該類具有無法序列化的屬性/字段,那麼可以通過繼承該類並覆蓋這些屬性/字段來將它們裝飾爲[NonSerialized]

+0

@PrutsWonder - 你的答案允許擺脫異常。現在我知道我需要在序列化之前先考慮,我爲此感謝你。但是,我仍然想知道我沒有寫什麼課程。我是否使用序列化屬性修飾該類? – Richard77 2010-04-15 14:52:34

+0

不幸的是,db.InsertOnSubmit正在生成「未設置爲對象實例的對象」異常。還有什麼要做的嗎? – Richard77 2010-04-15 15:18:05

+0

用可能的解決方案更新了答案。 – Prutswonder 2010-04-16 06:49:34

0

我想你需要裝飾的基類,但是,在DataContext自動生成的類被標記爲partial。你有沒有嘗試做類似的事情:

[Serializable] 
public partial class ContactDataContext 
{ 
} 

不知道它是否會工作,但它的值得一試。

1

您可以創建一個知道如何序列躲閃類的替代品 - 見here爲例

2

這可能是值得退後一步,看,如果你想達到什麼纔是真正有效的。

通常,一個可序列化的類用於兩層之間的數據傳輸。它更可能是一個只保存數據的簡單類。

它似乎有點不合適,因爲它保持了堅持數據庫的能力。管道的兩端實際上不可能訪問數據庫,並且他們似乎不太可能有能力保存數據。

我不知道是否值得將存儲保存到存儲庫。所以有一個存儲庫類將接受數據傳輸對象,構建數據庫對象並保存它。

這將簡化您的代碼並完全避免您遇到的問題。它也將大大提高可測性。

+0

@Mac:我喜歡你的建議 – Richard77 2010-04-19 18:31:31