【问题标题】:Add raw serialized value to a repeated field in protocol buffers (protobuf-net, protobuf-csharp)将原始序列化值添加到协议缓冲区中的重复字段(protobuf-net、protobuf-csharp)
【发布时间】:2011-03-27 04:28:45
【问题描述】:

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

【问题讨论】:

    标签: c# protocol-buffers protobuf-net


    【解决方案1】:

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

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

    然后,执行以下操作:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 在这种情况下,我必须将响应消息中的 DataItem 替换为 bytes 并让客户端将这些字节解释为 DataItem 对象。我一直在寻找一种解决方案,既能保持类型安全,又能以序列化(二进制)形式添加对象。
      • @Boris:我不相信我在任何 protobuf 库中都看到过这样做的任何方法。
      • 好吧,我想这太好了,难以置信;)感谢乔恩的及时回答!
      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多