1

试图在 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
}

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

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

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

4

1 回答 1

1

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

  • 序列化非公共类型
  • 序列化私有字段
  • 序列化树
  • 构造函数跳过或用户提供的工厂(或只是无参数构造函数)
  • 序列化完整/循环图(通过将受影响的显式标记为引用)
  • 属性使用,或运行时配置,完全不改变 DTO(坦率地说,属性通常更容易)
  • 快速紧凑的输出
  • 继承支持

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

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

于 2012-11-25T15:05:22.440 回答