使用IEnumerables序列化类 - 与Enyim Memcached一起使用

Ale*_*lex 4 c# serialization memcached enyim

我的模型看起来像:

[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; }
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用EnyimMemcached在memcached中缓存它.

不会抛出任何异常,但不会存储该项.
我已将此跟踪到我的TemplatePageModel类不可序列化的事实.

我用这个小片段测试了这个:

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

它抱怨我的IEnumerable属性.

实际错误消息是:

输入'System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [[System.Xml.Linq.XElement,System.Xml.Linq,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[Desktop.Service.Model.ControlModel ,Dekstop.Service,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'在Assembly'System.Core,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为可序列化.

我怎么能绕过这个?

我希望不必首先序列化为json,并在可能的情况下对出路进行反序列化....

Mar*_*ell 6

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

也许更简单的选择:不要尝试序列化复杂的表达式.所以代替:

obj.Controls = someQuery.Where(x => whatever).OrderBy(x => x.Foo);
Run Code Online (Sandbox Code Playgroud)

做:

obj.Controls = someQuery.Where(x => whatever).OrderBy(x => x.Foo).ToArray();
Run Code Online (Sandbox Code Playgroud)

数组(或列表)简单且易于序列化.