C ++ Hazelcast с сериализацией Protobuf: строка не отформатирована в UTF-8 - PullRequest
0 голосов
/ 09 июля 2020

Я хочу иметь возможность отправлять сериализованные данные Protobuf с помощью HazelCast. Я понимаю, почему это вызывает ошибку, но есть ли способ ее обойти?

Вот пример кода, который я использую:

main. cpp

#include <iostream>
#include <vector>
#include <hazelcast/client/HazelcastClient.h>
#include "testProto.pb.h"

using namespace std;

int main(){

    // create object
    tutorial::Input protoInput;
    protoInput.set_innum(500);

    // buffer to store serialized string
    string stringBuffer;
    protoInputer.SerializeToString(&stringBuffer);
    
 
    // set up hazelcast client
    hazelcast::client::ClientConfig(config);
    hazelcast::client::HazelcastClient hz(config);
    hazelcast::client::IMap<string,string> map = hz.getMap<string,string>("myMap");
    
    //error is from trying to write it
    map.put("Input", stringBuffer);

    return 0;
}

testProto.proto

syntax = "proto3";
package tutorial;

message Input{
    int64 inNum = 1;
}

1 Ответ

1 голос
/ 09 июля 2020

From protobuf do c:

SerializeToString (string * output) const;

сериализует сообщение и сохраняет байты в данной строке . Обратите внимание, что байты являются двоичными, а не текстовыми; мы используем только строковый класс в качестве удобного контейнера.

Поэтому небезопасно хранить их в виде строк в IMap, так как он может потерпеть неудачу в случае, если формат не UTF-8. Я предлагаю вам хранить protobuf как вектор байтов - где hazelcast::byte это unsigned char:

hz.getMap<string, vector<hazelcast::byte>>("proto_map");
...