C++ String的序列化和反序列化API(ProtoBuf )

//C++string序列化和序列化API
bool SerializeToString(string* output) const;
bool ParseFromString(const string& data);
//使用:
void set_people()             
{
    wp.set_name("sealyao");   
    wp.set_id(123456);        
    wp.set_email("sealyaog@gmail.com");
    wp.SerializeToString(&pstring);
}
 
void get_people()             
{
    rsp.ParseFromString(pstring);  
    cout << "Get People from String:" << endl;
    cout << "\t Name : " <<rsp.name() << endl;
    cout << "\t Id : " << rsp.id() << endl;
    cout << "\t email : " << rsp.email() << endl;
}
### C++Protobuf 序列化反序列化的实现 在C++中,Protocol Buffers (Protobuf) 提供了一种高效的方法来序列化结构化数据。为了使用 Protobuf 进行序列化反序列化操作,首先需要定义 `.proto` 文件描述消息格式。 #### 定义 .proto 文件 创建一个简单的 `person.proto` 文件作为例子: ```protobuf syntax = "proto3"; message Person { string name = 1; int32 id = 2; string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { string number = 1; PhoneType type = 2; } repeated PhoneNumber phones = 4; } ``` 此文件定义了一个包含姓名、ID 电子邮件地址的人的信息,并允许附加多个电话号码及其类型[^1]。 #### 编译 Proto 文件 通过命令行工具 protoc 将上述 proto 文件编译成相应的 C++ 类: ```bash protoc --cpp_out=. person.proto ``` 这会在当前目录下生成两个文件:`person.pb.h` `person.pb.cc`,它们包含了用于处理该协议缓冲区类型的类声明与定义[^4]。 #### 实现序列化功能 下面展示如何实例化并填充这些由 Protobuf 自动生成的消息对象,再将其写入二进制流或字符串形式保存起来。 ```cpp #include <fstream> #include "person.pb.h" void SerializeToFile(const std::string& filename, const tutorial::Person& person) { // 创建输出文件流 std::ofstream output(filename.c_str(), std::ios::out | std::ios::binary); if (!output.is_open()) { throw std::runtime_error("Could not open file."); } // 使用SerializeToOstream函数将数据写出到文件 if (!person.SerializeToOstream(&output)) { throw std::runtime_error("Failed to write data."); } } std::string SerializeToString(const tutorial::Person& person) { // 准备接收序列化后的字节串容器 std::string serializedData; // 调用SerializeToString方法完成转换工作 if (!person.SerializeToString(&serializedData)) { throw std::runtime_error("Serialization failed"); } return serializedData; } ``` 这段代码展示了两种常见的序列化方式——直接存盘以及转为字符串形式存储于内存之中[^3]。 #### 反序列化过程演示 当接收到经过编码的数据包之后,则可以利用对应的解析接口恢复原始的对象状态。 ```cpp tutorial::Person DeserializeFromFile(const std::string& filename) { // 构造新的目标对象实例 tutorial::Person person; // 打开输入源准备读取内容 std::ifstream input(filename.c_str(), std::ios::in | std::ios::binary); if (!input.is_open()) { throw std::runtime_error("File could not be opened for reading."); } // 解析来自输入流的内容至新构建的目标实体上 if (!person.ParseFromIstream(&input)) { throw std::runtime_error("Parsing from istream failed."); } return person; } tutorial::Person DeserializeFromString(const std::string& str) { // 同样先建立一个新的待填充值的实例 tutorial::Person person; // 利用ParseFromArray静态成员函数加载已有的字符数组资源 if (!person.ParseFromString(str)) { throw std::runtime_error("Deserialization failed"); } return person; } ``` 以上就是完整的基于 Protocol Buffer 技术栈,在 C++ 环境下的序列化/反序列化流程介绍[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值