2012-07-03 33 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