我的模型看起来像:
[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,Version = 4.0.0.0,Culture = neutral, 公钥= b77a5c561934e089],[Desktop.Service.Model.ControlModel, Dekstop.Service,Version = 1.0.0.0,Culture = neutral, 在Assembly'System.Core中,PublicKeyToken = null]]',版本= 4.0.0.0, Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为 序列化的。
我怎样才能解决这个问题?
我希望不必首先序列化为json,并在可能的情况下反序列化....
答案 0 :(得分: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();
数组(或列表)很简单,可以轻松序列化。