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';
}
这是有一张地图的 .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';
}