将原始序列化值添加到协议缓冲区中的重复字段(protobuf-net,protobuf-csharp)

时间:2010-08-09 08:23:43

标签: c# protocol-buffers protobuf-net

我正在寻找一种方法来将对象的序列化值(byte [])添加到协议缓冲区消息中的重复字段中。

我有一个应用程序,它将数据项保存为memcached中的序列化形式,并且需要将它们传递给远程客户端。客户端通过提供密钥列表来请求数据项,并且服务器发送回数据项列表。数据项的内容对服务器来说并不重要;它不需要知道它们中包含的内容,只需要知道它们的密钥。

当前的方法是从memcached中获取项目,对它们进行反序列化,将它们添加到响应中的数据项列表中,将响应序列化为字节数组并通过套接字发送。这不是最佳的,因为我们反序列化数据项只是为了让它们在下一步中再次序列化。两个序列化(用于memcached和用于输出)都是使用协议缓冲区完成的。理想情况下,我们可以在从memcached获取数据后跳过反序列化,并将序列化值添加到响应中。我查看了protobuf-net和protobuf-csharp,但没有找到实现这一目标的方法。可能吗?我忽视了什么吗?

以下是原型定义(简化):

message Request {    
    required int32 messageId;
    repeated string keys;
}

message DataItem {

    required string key = 1;
    required ValueType type = 2;      // the type of the value, enumeration

    optional int32 intValue = 3;
    optional int64 longValue = 4;
    optional double doubleValue = 5;
    optional float floatValue = 6;
    optional bool boolValue = 7;
    optional string stringValue = 8;
}

message Response {
    required int32 messageId;
    repeated DataItem dataItems;
}

2 个答案:

答案 0 :(得分:1)

嗯,bytes字段类型代表不透明的二进制数据......你正在寻找什么?请注意,出于不可变性的目的(无论如何在protobuf-csharp中),这些值表示为不可变ByteString值 - 但是您可以将这些值从一条消息复制到另一条消息而不复制实际数据(即保留单个引用)两条消息中的相同blob)。

答案 1 :(得分:0)

您可以向protobuf添加一条消息:

message RawResponse {
    required int32 messageId;
    repeated bytes dataItems;
}

然后,请执行以下操作:

  1. 直接将memcached项目提取到RawResponse
  2. 发回RawResponse
  3. 在客户端上反序列化为Response
  4. 这种方法可行,因为RawResponse和Response都具有相同的二进制表示。 [1]