Добавить необработанное сериализованное значение в повторяющееся поле в буферах протокола (protobuf-net, protobuf-csharp) - PullRequest
3 голосов
/ 09 августа 2010

Я ищу способ добавить сериализованное значение объекта (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 ]

1 голос
/ 09 августа 2010

Ну, а тип поля bytes представляет непрозрачные двоичные данные ... это то, что вы ищете? Обратите внимание, что в целях неизменяемости (в любом случае, в protobuf-csharp) они представлены в виде неизменяемых ByteString значений - но вы сможете копировать их из одного сообщения в другое без копирования реальных данных (т.е. сохранять единственную ссылку на один и тот же блоб в двух сообщениях).

0 голосов
/ 05 июля 2017

Вы можете добавить еще одно сообщение в ваш protobuf:

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

Затем выполните следующее:

  1. Извлечение memcached элементов непосредственно в RawResponse
  2. Отправить RawResponse обратно
  3. На клиенте десериализовать в ответ

Этот подход будет работать, потому что и RawResponse, и Response будут иметь одинаковое двоичное представление. [ 1 ]

...