3

我正在寻找一种将对象的序列化值 (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;
}
4

2 回答 2

1

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

于 2010-08-09T08:30:54.883 回答
0

您可以在 protobuf 中再添加一条消息:

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

然后,执行以下操作:

  1. 将 memcached 项直接获取到 RawResponse
  2. 发回 RawResponse
  3. 在客户端反序列化为响应

这种方法会起作用,因为 RawResponse 和 Response 都具有相同的二进制表示。[ 1 ]

于 2017-07-05T20:58:32.933 回答