c# – 在ServiceStack中使用ICacheClient和protobuf时出现编码/
我正在使用当前的ServiceStack与protobuf序列化.
添加ICacheClient以缓存我的响应时,从缓存客户端发送的二进制答案与没有任何缓存客户端的原始响应具有不同的编码/二进制序列化. 这导致了客户端的反序列化问题,我正在使用预编译的反序列化器. 例如,在ServiceStack服务器端使用ICacheClient时,在客户端发生此protobuf异常: OverflowException: Number overflow. ProtoBuf.ProtoReader.TryReadUInt32VariantWithoutMoving (Boolean trimNegative,System.UInt32& value) ProtoBuf.ProtoReader.ReadUInt32Variant (Boolean trimNegative) ProtoBuf.ProtoReader.ReadUInt32 () MyModelSerializer.Read (My.Models.MyDataModel,ProtoBuf.ProtoReader ) (我相信这是一个随机的例外,非常肯定也会出现其他例外情况.以此为例.) MemoryCacheClient和Redis缓存客户端的行为相同. 这是我初始化protobuf的方式: ContentTypeFilters.Register(ContentType.ProtoBuf,(reqCtx,res,stream) => ProtoBuf.Serializer.NonGeneric.Serialize(stream,res),ProtoBuf.Serializer.NonGeneric.Deserialize); Cache Client初始化如下: container.Register<ICacheClient>(new MemoryCacheClient()); (或者Redie在this guide之后). 这是通过线路的缓存的protobuf序列化数据看起来和未缓存的数据的不同之处: Big Image 未缓存的响应似乎以不同方式编码/序列化. 我有什么办法可以解决这个编码问题,使Redis或Memory-ICacheClient与protobuf兼容吗? 更新:我调查了一下,这些是我的发现: >要存储在缓存提供程序中(无论是Redis os Memory),protobuf二进制流通过HttpResponseFilter-> SerializeToString中的StreamReader“转换”为字符串,使用“UTF8 without BOM”-Encoding,它本身被称为通过CacheClientExtensions-> Cache(). 解决方法
我正在挖掘ServiceStack代码,但发现没有可能实现我的要求(我真的希望我没有忽略一些东西).
所以我对ServiceStack进行了一些更改,这些更改允许使用自定义TextSerializers,然后用于序列化到字符串bevor将DTO推送到缓存客户端. 在这里看到我的差异: 它可以用于我的目的,虽然它可能没有经过全面测试,但仍然是非常重要的原型. 如果一些ServiceStack忍者可以审查我正在做的事情,我会很感激,也许它最终会被拉入请求. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |