以下は、データベース/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;
}
GRPC Getting Startedで詳しく説明されているように、対応する C# クラスを作成しました。サーバーでこれらのクラスを使用して DB クエリの結果を保存し、これらのオブジェクトを 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に直接保存できるようにするより良い方法またはメカニズムがあるはずですが、残念ながらグーグルはその点であまり役に立ちませんでした。
これは2つの方法で達成できます
protobuf オブジェクトからシリアル化可能なオブジェクトにデータをコピーし、後で参照できるように memcached に保存します。
データをシリアル化可能なオブジェクトにコピーし、そのオブジェクトを使用して protobuf オブジェクトを設定します。
しかし、これら 2 つのアプローチには追加の作業が必要です。これを達成するためのより良い方法はありますか?
[PS: 私は proto3 を使用しているため、c# をサポートしています]