赞
踩
这两天在做相关工作的时候,遇到了一个需要定义optional double
类型的proto字段,因为之前没用过,所以一时之间不知道怎么定义,查找了下相关资料后发现也很简单,就总结一下吧,以备不时之需。
Google Protocol Buffers (protobuf) 是一种用于序列化结构化数据的轻量级、高效的数据交换格式。在proto3版本中,提供了一种特殊的包装类型,用于包装基本数据类型,其中就包括 google.protobuf.DoubleValue
类型,用于包装 double
类型的数据。
DoubleValue
的主要作用是在需要可选的 double
类型数据时,提供一种更丰富的表达方式。它可以用于表示一个 double
类型的值,同时允许指定该值是否存在(即可选或缺失的)。这对于处理可能缺失或未设置值的场景非常有意义。
首先,我们需要在 .proto 文件中定义消息类型,包括 DoubleValue
类型的字段。
protobufCopy codesyntax = "proto3";
import "google/protobuf/wrappers.proto";
message MyMessage {
google.protobuf.DoubleValue my_double_value = 1;
}
我们可以通过以下方式进行设值:
my_message.mutable_my_double_value()->set_value(42.5);
// 检查 DoubleValue 字段是否存在
if (deserialized_message.has_my_double_value()) {
// 获取 DoubleValue 字段的值
double my_double_value = deserialized_message.my_double_value().value();
std::cout << "DoubleValue: " << my_double_value << std::endl;
} else {
std::cout << "DoubleValue is not set." << std::endl;
}
#include <iostream> #include "your_proto_file.pb.h" int main() { // 创建消息对象 MyMessage my_message; // 设置 DoubleValue 字段的值 my_message.mutable_my_double_value()->set_value(42.5); // 将消息序列化为字符串 std::string serialized_data = my_message.SerializeAsString(); // 打印序列化后的数据 std::cout << "Serialized Data: " << serialized_data << std::endl; // 反序列化消息 MyMessage deserialized_message; deserialized_message.ParseFromString(serialized_data); // 检查 DoubleValue 字段是否存在 if (deserialized_message.has_my_double_value()) { // 获取 DoubleValue 字段的值 double my_double_value = deserialized_message.my_double_value().value(); std::cout << "DoubleValue: " << my_double_value << std::endl; } else { std::cout << "DoubleValue is not set." << std::endl; } return 0; }
上述代码中,首先创建了一个 MyMessage
对象,设置了其中的 my_double_value
字段,然后将消息序列化为字符串。接着,反序列化该字符串,并检查 my_double_value
字段是否存在,如果存在,则获取其值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。