以下是我用来创建从数据库/memcached 获取数据的 GRPC 系统的 proto 文件。
message CMSContent
{
repeated ArticleSummary Articles = 1;
uint32 RecordCount = 2;
}
service Article
{
rpc ListByCategory(ArticleByCatURI) returns (CMSContent){}
}
message ArticleByCatURI
{
uint32 ApplicationId = 1;
}
message ArticleSummary
{
uint32 ArticleId = 1;
string ArticleName = 2;
}
我创建了相应的 C# 类,详见GRPC Getting Started。我在服务器上使用这些类来存储数据库查询的结果并尝试将这些对象保存到 memcached。不幸的是,protobuf 对象没有被添加到 memcached 中。以下是我将它添加到 memcached 的方式,isKeyFirstTimeCreated
当我尝试添加它时,它的值为 false。
isKeyFirstTimeCreated = mc.Store(StoreMode.Add, key, t, DateTime.Now.Add(cacheDuration));
根据 memcached 的要求,必须存储在 memcached 中的所有对象都必须是可序列化的。但是自动生成的 protobuf 类不可序列化(至少对于 c# 使用的二进制格式化程序)。现在,由于这些类是部分实现,我使它们可序列化,但这并没有帮助,因为 RepeatedField 不是可序列化的。
IMO,应该有更好的方法或某种机制可以让我将 protobuf 对象直接保存到 memcached 中,但不幸的是,谷歌搜索在这方面对我没有多大帮助。
我可以通过两种方式实现这一点
通过将数据从 protobuf 对象复制到可序列化对象,然后将其保存到 memcached 中以供将来参考
将数据复制到可序列化的对象中,并使用该对象填充 protobuf 对象。
但是这两个接近需要额外的工作。有没有更好的方法来实现这一目标?
[PS:我使用的是proto3,因此它支持c#]