PB的Message根据filed获取值
时间: 2023-08-26 22:18:17 浏览: 166
可以通过在Message中使用反射来获取指定字段的值。以下是一个例子:
假设我们有一个Person.proto文件,其中定义了一个Person消息类型:
```
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
repeated string hobbies = 3;
}
```
在Java中,我们可以通过以下方式获取Person消息中的name字段的值:
```
Person person = Person.newBuilder().setName("John").setAge(30).addHobbies("Reading").addHobbies("Traveling").build();
String name = (String) person.getClass().getMethod("getName").invoke(person);
System.out.println(name); // 输出 "John"
```
这里我们使用了反射来获取Person类中的getName方法,并通过invoke方法来执行该方法获取name字段的值。同样的方式可以用来获取age和hobbies字段的值。
相关问题
c++的PB的Message根据filed获取值
在C++中,可以使用`google::protobuf::Message`类的`GetReflection()`方法来获取`google::protobuf::MessageReflection`对象,然后使用该对象的`GetField()`方法获取指定字段的值。以下是一个例子:
假设我们有一个Person.proto文件,其中定义了一个Person消息类型:
```
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
repeated string hobbies = 3;
}
```
在C++中,我们可以通过以下方式获取Person消息中的name字段的值:
```
#include <iostream>
#include "person.pb.h"
int main() {
Person person;
person.set_name("John");
person.set_age(30);
person.add_hobbies("Reading");
person.add_hobbies("Traveling");
const auto& reflection = person.GetReflection();
const auto* descriptor = person.GetDescriptor();
const auto* field_descriptor = descriptor->FindFieldByName("name");
std::string name = reflection.GetString(person, field_descriptor);
std::cout << name << std::endl; // 输出 "John"
return 0;
}
```
这里我们先创建了一个Person对象,并设置了name、age和hobbies字段的值。然后使用`GetReflection()`方法获取`google::protobuf::MessageReflection`对象,使用`GetDescriptor()`方法获取`google::protobuf::Descriptor`对象,使用该对象的`FindFieldByName()`方法获取name字段的`google::protobuf::FieldDescriptor`对象。最后,我们使用`GetString()`方法获取name字段的值。同样的方式可以用来获取age和hobbies字段的值。
c++的PB的Message根据filed获取不知道类型的值
在C++中,可以使用`google::protobuf::Message`类的`GetReflection()`方法来获取`google::protobuf::MessageReflection`对象,然后使用该对象的`GetField()`方法获取指定字段的值。对于不知道类型的值,可以使用`google::protobuf::Message`类的`GetDescriptor()`方法获取`google::protobuf::FieldDescriptor`对象,然后使用该对象的`cpp_type()`方法获取字段的类型,最后根据类型使用对应的`Get`方法获取值。以下是一个例子:
假设我们有一个Person.proto文件,其中定义了一个Person消息类型:
```
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
repeated string hobbies = 3;
}
```
在C++中,我们可以通过以下方式获取Person消息中的name字段的值:
```
#include <iostream>
#include "person.pb.h"
int main() {
Person person;
person.set_name("John");
person.set_age(30);
const auto& reflection = person.GetReflection();
const auto* descriptor = person.GetDescriptor();
const auto* field_descriptor = descriptor->FindFieldByName("name");
switch (field_descriptor->cpp_type()) {
case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
std::cout << reflection.GetString(person, field_descriptor) << std::endl;
break;
case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
std::cout << reflection.GetInt32(person, field_descriptor) << std::endl;
break;
// 也可以处理其他类型,例如repeated string
default:
break;
}
return 0;
}
```
这里我们先创建了一个Person对象,并设置了name和age字段的值。然后使用`GetReflection()`方法获取`google::protobuf::MessageReflection`对象,使用`GetDescriptor()`方法获取`google::protobuf::Descriptor`对象,使用该对象的`FindFieldByName()`方法获取name字段的`google::protobuf::FieldDescriptor`对象。然后,我们根据字段的类型使用对应的`Get`方法获取值。同样的方式可以用来获取age和hobbies字段的值。如果字段类型未知,可以使用`cpp_type()`方法进行判断。
阅读全文