在.NET中序列化复杂对象层以进行缓存的最简单方法是什么?

时间:2012-11-25 14:44:28

标签: .net serialization memcached protobuf-net msgpack

尝试将缓存/状态持久化引入到具有在IIS下运行的复杂对象层(以及WCF服务层,而不是此处的焦点)的应用程序的中间层。已经确定了memcached / enyim作为缓存架构,现在需要为它们有效地序列化这些对象(速度和空间)。

对象层在对象之间有很多指针和相互依赖关系:

internal class SomeObj
{
    private string attr1;
    private int attr2;
    private OtherObj otherObj;
    private List<OtherOtherObj> otherObjs;
}

internal class OtherObj
{
    //...more attributes
}

internal class OtherOtherObj
{
    // you get the idea
}

请注意,所有字段都是私有的。另外值得注意的是,大多数对象都是内部的,并且许多属性是只读的(无设置)或从用户角度使用set(即使对象“脏”),因此不能用于补液。我有几十种需要缓存的类型。

我喜欢protobuf-net和msgpack的外观,但是我需要尽可能快地完成序列化,尽可能少地改变现有的架构(效果很好),看起来像这两者都对对象层次结构的支持有限。我很了解DTO类型的序列化,但我很想规划一个序列化缓存对象的正确方法。这些工具中的一个可以为我工作吗?我是否坚持使用内置的.NET二进制文件来处理构造函数,并按照我自己的条件重新填充属性和对象?

编辑:只是为了澄清最后一个问题 - 如果它读作“我是否坚持使用内置的.NET二进制文件以便我可以控制构造函数,并重新填充属性和根据我自己的条件对象?

1 个答案:

答案 0 :(得分:1)

我不能评论msgpack,但是是的:protobuf-net可以做你提到的所有事情,包括:

  • 序列化非公开类型
  • 序列化私人字段
  • 序列化树
  • 构造函数跳过或用户提供的工厂(或只是无参数构造函数)
  • 序列化完整/循环图(通过明确标记受影响的参考)
  • 属性用法或运行时配置根本没有改变DTO(虽然坦率地说,属性通常更容易)
  • 快速紧凑的输出
  • 继承支持

在给出示例的情况下,最简单的“它是否工作”测试将仅使用[ProtoContract]创建类型(在该属性中有用于构造函数跳过的可选设置),并将字段标记为[ ProtoMember(n)],例如n = 1,2,3,...(每种类型都是唯一的,但在类型之间不需要是唯一的)

除了我们使用Redis + BookSleeve而不是memcached + enyim之外,这正是我们在Stack Exchange上进行对象缓存所做的。好吧,我们也为大型对象做一个推测性的gzip - 如果有很多字符串数据,gzip可以帮助削减一些额外的字节。