您的位置 首页 编程知识

C++如何将数据序列化和反序列化_C++ 数据序列化方法

C++中序列化常用JSON、二进制、Protobuf或自定义方法;JSON易读适合配置,用nlohmann/j…


C++中序列化常用JSON、二进制、Protobuf或自定义方法;JSON易读适合配置,用nlohmann/json库实现对象与JSON互转;二进制高效但限POD类型且需处理字节序;Protobuf跨语言高性能,需定义.proto文件生成代码;自定义接口灵活但需手动管理字段读写与内存。

C++如何将数据序列化和反序列化_C++ 数据序列化方法

在C++中实现数据的序列化和反序列化,通常需要将对象转换为流以便存储或传输,然后再还原为原始对象。由于C++没有内置的序列化机制,开发者需借助自定义方法或其他来完成。

使用JSON进行序列化与反序列化

JSON是一种轻量、易读的数据交换格式,适合或网络通信。通过第三方库如 nlohmann/on 可以轻松实现C++对象与JSON之间的转换。

示例代码:

 #include <iostream> #include <nlohmann/json.hpp>  struct Person {     std::string name;     int age; };  // 序列化 void to_json(nlohmann::json& j, const Person& p) {     j = nlohmann::json{{"name", p.name}, {"age", p.age}}; }  // 反序列化 void from_json(const nlohmann::json& j, Person& p) {     j.at("name").get_to(p.name);     j.at("age").get_to(p.age); }  int main() {     Person p{"Alice", 30};      // 转为JSON字符串     nlohmann::json j = p;     std::string json_str = j.dump();     std::cout << json_str << std::endl;      // 从JSON恢复对象     auto p2 = j.get<Person>();     std::cout << p2.name << ", " << p2.age << std::endl;      return 0; } 
登录后复制

使用二进制方式进行高效序列化

对于性能要求高的场景,可采用二进制方式直接写入内存数据。适用于POD(Pln Old Data)类型。

立即学习“”;

说明:该方法不支持复杂结构(如指针、STL容器),且跨平台时需注意字节序问题。

示例:

 #include <fstream> #include <iostream>  struct Data {     int id;     double value; };  // 写入二进制文件(序列化) void save_binary(const Data& d, const std::string& filename) {     std::ofstream out(filename, std::ios::binary);     out.write(reinterpret_cast<const char*>(&d), sizeof(Data)); }  // 读取二进制文件(反序列化) void load_binary(Data& d, const std::string& filename) {     std::ifstream in(filename, std::ios::binary);     in.read(reinterpret_cast<char*>(&d), sizeof(Data)); }  int main() {     Data d{1, 3.14};     save_binary(d, "data.bin");      Data loaded{};     load_binary(loaded, "data.bin");     std::cout << "ID: " << loaded.id << ", Value: " << loaded.value << std::endl;      return 0; } 
登录后复制

使用Google Protocol Buffers(Protobuf)

Protobuf是Google开发的高效、跨语言的序列化方案。需定义 .proto 文件并生成C++代码。

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

C++如何将数据序列化和反序列化_C++ 数据序列化方法0

步骤:

  • 编写 .proto 文件描述数据结构
  • 使用 protoc 编译器生成 C++ 类
  • 调用 SerializeToString / ParseFromString 方法

.proto 示例:

 syntax = "proto3"; message Person {     string name = 1;     int32 age = 2; } 
登录后复制

C++ 使用:

 Person person; person.set_name("Bob"); person.set_age(25);  std::string buffer; person.SerializeToString(&buffer);  // 序列化  Person recovered; recovered.ParseFromString(buffer);  // 反序列化 
登录后复制

自定义序列化接口

对复杂类,可以设计统一的序列化接口,手动控制字段读写。

例如:

 class Serializable { public:     virtual void serialize(std::ostream& os) const = 0;     virtual void deserialize(std::istream& is) = 0; };  struct MyData : Serializable {     int x;     std::string s;      void serialize(std::ostream& os) const override {         os.write(reinterpret_cast<const char*>(&x), sizeof(x));         size_t len = s.size();         os.write(reinterpret_cast<const char*>(&len), sizeof(len));         os.write(s.data(), len);     }      void deserialize(std::istream& is) override {         is.read(reinterpret_cast<char*>(&x), sizeof(x));         size_t len;         is.read(reinterpret_cast<char*>(&len), sizeof(len));         s.resize(len);         is.read(&s[0], len);     } }; 
登录后复制

基本上就这些。选择哪种方法取决于你的需求:调试友好选JSON,性能优先考虑二进制或Protobuf,跨平台兼容性要求高推荐Protobuf。自定义方式灵活但需小心管理内存和格式一致性。

以上就是C++如何将数据序列化和反序列化_C++ 数据序列化方法的详细内容,更多请关注php中文网其它相关文章!

相关标签:

本文来自网络,不代表四平甲倪网络网站制作专家立场,转载请注明出处:http://www.elephantgpt.cn/15261.html

作者: nijia

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

18844404989

在线咨询: QQ交谈

邮箱: 641522856@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部