尝试将缓存/状态持久化引入到具有在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二进制文件以便我可以控制构造函数,并重新填充属性和根据我自己的条件对象?
答案 0 :(得分:1)
我不能评论msgpack,但是是的:protobuf-net可以做你提到的所有事情,包括:
在给出示例的情况下,最简单的“它是否工作”测试将仅使用[ProtoContract]创建类型(在该属性中有用于构造函数跳过的可选设置),并将字段标记为[ ProtoMember(n)],例如n = 1,2,3,...(每种类型都是唯一的,但在类型之间不需要是唯一的)
除了我们使用Redis + BookSleeve而不是memcached + enyim之外,这正是我们在Stack Exchange上进行对象缓存所做的。好吧,我们也为大型对象做一个推测性的gzip - 如果有很多字符串数据,gzip可以帮助削减一些额外的字节。