2012-07-03 31 views
4

使用我有一個模型,看起來像:與IEnumerables序列化類 - 與Enyim Memcached的

[Serializable] 
public class TemplatePageModel 
{ 
    public PageModel Page { get; set; } 
    public SidebarModel Sidebar { get; set; } 
} 

[Serializable] 
public class PageModel 
{ 
    public IEnumerable<SectionModel> Section { get; set; } 
} 

[Serializable] 
public class SidebarModel 
{ 
    public IEnumerable<ControlModel> Control { get; set; } 
} 

[Serializable] 
public class SectionModel 
{ 
    public string Order { get; set; } 

    public string Editable { get; set; } 

    public string Column { get; set; } 

    public string Text { get; set; } 
} 

我則嘗試使用EnyimMemcached在memcached中緩存此。

不會拋出異常,但該項目不存儲。
我已經跟蹤到這個事實,我的TemplatePageModel類是不可序列化的。

我這個小片段測試了這個:

MemoryStream mem = new MemoryStream(); 
BinaryFormatter b = new BinaryFormatter(); 
try 
{ 
    b.Serialize(mem, result); 
} 
catch (Exception ex) 
{ 
    //EXCEPTION HERE 
} 

它抱怨我的IEnumerable屬性。

實際錯誤信息是:

類型 「System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [[System.Xml.Linq.XElement, System.Xml.Linq的,版本= 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089],[Desktop.Service.Model.ControlModel, Dekstop.Service,Version = 1.0.0.0,Culture = neutral, PublicKeyToken = null]]'in Assembly'System.Core,Version = 4.0.0.0, Culture = neutral,PublicKeyToken = b77a5c561934e089'未被標記爲 可序列化。

我該如何解決這個問題?

我希望不要有序列化JSON到第一,並進行可能的話順便....

+1

定義「抱怨」。告訴我們確切的消息。實際上,請注意'BinaryFormatter'不關心是否IEnumerable - 它是一個字段級別的序列化器。它可能會關心的是一些不是'[Serializable]'的東西。那麼:在運行時,'.Section'和'.Control' **實際上**是什麼? –

+0

對不起,現在編輯顯示實際的錯誤信息 – Alex

回答

6

BinaryFormatter反序列化是一個字段級串行器。它不在乎是否IEnumerable等。它只是在乎:「這裏的對象是什麼,我可以序列化它嗎?」。例如,數組或列表通常是可序列化的。一些自定義的延遲序列(可能是過濾的LINQ表達式)可能是而不是可序列化的。

也許更簡單的選擇:不要試圖序列化複雜的表達式。因此,而不是:

obj.Controls = someQuery.Where(x => whatever).OrderBy(x => x.Foo); 

做:

obj.Controls = someQuery.Where(x => whatever).OrderBy(x => x.Foo).ToArray(); 

數組(或列表)簡單,平凡的序列化。

+0

是..正在使用Linq從XML創建對象...沒有調用.ToList的一個地方..導致問題。謝謝! – Alex

+0

我不知道我的理解正確:問題是因爲IEnumerable可能持有自定義延遲序列,因此無法序列化? – Dzyann