C++数据序列化

本文详细介绍了如何使用C++标准库中的iostream进行数据结构如Point和Paths的序列化和反序列化操作,展示了通过ostream和istream操作符重载实现的功能,并提供了一个实际的测试案例。同时提及了公司的技术服务方向,包括STM32等IT技术领域。
摘要由CSDN通过智能技术生成

概述

通过ostream/istream完成数据序列化,简单直接,学到此,做个记录。

std::ostream& operator<<(std::ostream& o, const Point& p) {
  o << p.x << " " << p.y << " ";
  return o;
}

std::istream& operator>>(std::istream& is, Point& p) {
  is >> p.x;
  is >> p.y;
  return is;
}

std::ostream& operator<<(std::ostream& o, const Paths& paths) {
  o << paths.source << paths.destinations.size() << " ";
  for (const auto& x : paths.destinations) { 
    o << x;
  }
  return o;
}

std::istream& operator>>(std::istream& is, Paths& paths) {
  size_t size;
  is >> paths.source;
  is >> size;
  for (;size;size--) {
    Point tmp;
    is >> tmp;
    paths.destinations.push_back(tmp);
  }
  return is;
}

测试代码

#include <iostream>
#include <sstream>
#include <list>

struct Point {
  int x, y;
};

struct Paths {
  Point source;
  std::list<Point> destinations;
};

std::ostream& operator<<(std::ostream& o, const Point& p) {
  o << p.x << " " << p.y << " ";
  return o;
}

std::istream& operator>>(std::istream& is, Point& p) {
  is >> p.x;
  is >> p.y;
  return is;
}

std::ostream& operator<<(std::ostream& o, const Paths& paths) {
  o << paths.source << paths.destinations.size() << " ";
  for (const auto& x : paths.destinations) { 
    o << x;
  }
  return o;
}

std::istream& operator>>(std::istream& is, Paths& paths) {
  size_t size;
  is >> paths.source;
  is >> size;
  for (;size;size--) {
    Point tmp;
    is >> tmp;
    paths.destinations.push_back(tmp);
  }
  return is;
}


int main(int argc, char** argv) {
  Paths paths = {{0, 0}, {{1, 1}, {0, 1}, {1, 0}}};

  std::stringstream in;
  in << paths;
  std::string serialized = in.str();
  std::cout << "Serialized paths into the string: ["
            << serialized << "]" << std::endl;

  std::stringstream out(serialized);
  Paths paths2;
  out >> paths2; 
  std::cout << "Original: " << paths.destinations.size()
            << " destinations" << std::endl;
  std::cout << "Restored: " << paths2.destinations.size()
            << " destinations" << std::endl;
  return 0;
}

我公司承接各类技术服务,主要聚焦于:stm32、单片机、嵌入式、QT应用开发、Web+Python+Django应用开发。欢迎合作。

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
序列化是将数据结构转换为可存储或传输的格式的过程,而反序列化则是将序列化后的数据重新转换为原始的数据结构的过程。在C语言中,我们可以通过使用字符数组来实现序列化和反序列化的功能。 以下是一个简单的C语言数据结构序列化代码示例: ```c #include <stdio.h> #include <string.h> // 定义一个简单的数据结构 struct Person { char name[20]; int age; }; // 序列化函数,将数据结构转换为字符串 void serialize(struct Person person, char* buffer) { sprintf(buffer, "%s,%d", person.name, person.age); } // 反序列化函数,将字符串转换为数据结构 struct Person deserialize(char* buffer) { struct Person person; sscanf(buffer, "%[^,],%d", person.name, &person.age); return person; } int main() { struct Person person = {"Alice", 25}; char buffer[50]; serialize(person, buffer); printf("序列化后的字符串: %s\n", buffer); struct Person newPerson = deserialize(buffer); printf("反序列化后的数据结构: 名字:%s, 年龄:%d\n", newPerson.name, newPerson.age); return 0; } ``` 在上面的代码中,我们定义了一个简单的Person结构体,然后实现了序列化和反序列化函数。序列化函数将Person结构体中的数据转换为字符串,然后可以进行存储或者传输。反序列化函数将字符串重新转换为Person结构体数据。最后在main函数中进行了序列化和反序列化的演示。 这是一个简单的C语言数据结构序列化代码示例,可以根据实际情况进行扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汉森教育

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值