【问题标题】:Serializing class with IEnumerables - to use with Enyim Memcached使用 IEnumerables 序列化类 - 与 Enyim Memcached 一起使用
【发布时间】:2012-07-03 21:48:04
【问题描述】:

我有一个看起来像这样的模型:

[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 类不可序列化这一事实。

我用这个小 sn-p 测试了这个:

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,文化=中性, PublicKeyToken=b77a5c561934e089],[Desktop.Service.Model.ControlModel, Dekstop.Service,版本=1.0.0.0,文化=中性, PublicKeyToken=null]]' 在程序集'System.Core,版本=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 未标记为 可序列化。

我怎样才能解决这个问题?

我希望不必先序列化为 json,如果可能的话,在退出时反序列化....

【问题讨论】:

  • 定义“抱怨”。告诉我们确切的信息。实际上,请注意 BinaryFormatter 并不关心是否是 IEnumerable - 它是一个字段级序列化程序。它可能关心的是一些不是[Serializable] 的东西。那么:.Section.Control 在运行时实际上是什么?
  • 抱歉,现在编辑显示实际错误信息

标签: c# serialization memcached enyim


【解决方案1】:

BinaryFormatter 是一个字段级序列化器。它不会关心是否有 IEnumerable 等。它只关心:“这里的 actual 对象是什么?我可以序列化它吗?”。例如,数组或列表通常是可序列化的。某些自定义延迟序列(可能是过滤的 LINQ 表达式)可能不可可序列化。

也许是一个更简单的选择:不要尝试序列化复杂的表达式。所以而不是:

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

做:

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

数组(或列表)简单且可轻松序列化。

【讨论】:

  • 是的.. 使用 Linq 从 XML 创建对象... 没有在 where 上调用 .ToList.. 导致问题。谢谢!
  • 我不确定我是否理解正确:问题是因为 IEnumerable 可能持有自定义延迟序列,因此无法序列化?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2010-11-10
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多