c ++在protobuf3中插入和读取Map元素

c++ Inset and read Map element in protobuf3

这是有一张地图的 .proto

map.proto

syntax = "proto3";

package demo;

message Person {

  map<string, int32> family_list = 4;

}

现在我从 Write_impl.cc

插入键和值
auto map = test.mutable_family_list();
string key = "faimly";
int val =20;
(*map)[key] = val;
std::cout<<"map = "<<(*map)[key]<<std::endl;

下面我在read_impl.cc

中读取键family的值
auto test = demo::Person::default_instance();
auto map = test.mutable_family_list();
std::cout<<"map = "<<(*map)["faimly"]<<std::endl;

问题:读取键"family"

的值时得到0

您使用的 demo::Person::default_instance() 没有您之前存储的值。它包含默认的。

您正在使用下标运算符 [],如果未找到键则不会抛出异常,但 at() 方法会抛出异常。您应该使用 at() 方法。

这里有一个序列化和反序列化的例子:

int main()
{
    // Serialization

    demo::Person sPerson;
    const auto mutable_family_list = sPerson.mutable_family_list();
    mutable_family_list->insert( { "abc", 42 } );
    std::cout << mutable_family_list->at( "abc" ) << '\n';

    const auto serialized = sPerson.SerializeAsString();

    // Deserialization

    demo::Person dPerson;
    if ( !dPerson.ParseFromString( serialized ) )
    {
        std::cerr << "Deserialization failed!\n";
        return -1;
    }

    const auto family_list = dPerson.family_list();
    std::cout << family_list.at("abc") << '\n';

    return 0;
}

输出:

42
42

或者,您可以先 find() 然后使用这样的值:

const auto it = family_list.find( "abc" );
if ( it != family_list.end() )
{
    std::cout << it->second << '\n';
}