c++的struct结构体的序列化和反序列化和json的序列化和反序列化的通俗直白的解释和说明

 1.由json解析的常用库nlohmann引入序列化反序列化的概念

序列化是指将对象转换为字节序列的过程,以便于存储或传输。在序列化过程中,对象的状态信息将被转换为字节流,可以保存到文件中或通过网络传输给其他计算机。反序列化则是将字节序列恢复为对象的过程

在代码种具体表示为这种

#include <iostream>
#include "nlohmann/json.hpp"
using json = nlohmann::json;
int main()
{
    json j;

    //反序列化方式1
    j["pi"] = 3.141;

    
    j["happy"] = true;

   
    j["name"] = "Niels";

   
    j["nothing"] = nullptr;

   
    j["answer"]["everything"] = 42;

   
    j["list"] = { 1, 0, 2 };

   
    j["object"] = { {"currency", "USD"}, {"value", 42.99} };
    std::cout << j << std::endl;


   
    //反序列化方式1
    auto j2 = R"(
  {
    "happy": true,
    "pi": 3.141
  }
)"_json;

    //反序列化方式1
    auto j3 = json::parse("{ \"happy\": true, \"pi\": 3.141 }");

    //序列化
    std::string a = j.dump();

   
}

当时笔者读到这里还是感觉有点抽象,单看代码和结合概念说明难以理解。

最终在c++直接进行序列化和反序列化的原生代码种完全明白了,在这里和读者进行分享

2.c++struct的序列化和反序列化

1.把struct结构体转换成字节流进行序列化

2.把字节流转换成struct进行反序列化

#include <iostream>


typedef unsigned char BYTE;
typedef struct tagStudents {
    std::string name;
    std::string No;
    int         age;
    int         grade;
    int         scores;
}STUDENTS, * LP_STUDENTS;

bool Serialize(BYTE** pMem, LP_STUDENTS pData)
{
    bool bok = false;
    

    bok = pData != NULL;
    if (bok)
    {
      //序列化过程,把内存种的结构体拷贝到领一个内存种,这个内存每个数据都是byte大小
      //就像int*指针空间自动认为是一个数据占四个字节,longlong*空间的一个数据自动占8个字节
       memcpy_s(*pMem, sizeof(STUDENTS), pData, sizeof(STUDENTS));
       
    }


    return bok;
}

bool DeSerialize(BYTE* pMem, LP_STUDENTS pData)
{
    bool bok = false;
    bok = pMem != NULL;
    if (bok)
    {
        //反序列化过程,把字节流转换成结构体类型,方便我们读取里面的数据
         memcpy_s(pData, sizeof(STUDENTS), pMem, sizeof(STUDENTS));
    }

    return bok;
}

int main()
{
    STUDENTS st;
    LP_STUDENTS pst = &st;

    STUDENTS st2;
    LP_STUDENTS pst2 = &st2;
    bool state;
    st.name = "jjk";
    st.No = "111";
    st.grade = 3;
    st.age = 23;
    st.scores = 95;
    BYTE* pbyte = (BYTE*)malloc(sizeof(STUDENTS));


    state = Serialize(&pbyte, pst);

    DeSerialize(pbyte, pst2);

    std::cout << pst2->name << std::endl;
    std::cout << pst2->age << std::endl;
    std::cout << pst2->No << std::endl;
    std::cout << pst2->grade << std::endl;
    std::cout << pst2->scores << std::endl;

    free(pbyte);
}

重点部分:memcpy_s(*pMem, sizeof(STUDENTS), pData, sizeof(STUDENTS));

序列化过程,把内存种的结构体拷贝到领一个内存种,这个内存每个数据都是byte大小
 就像int*指针空间自动认为是一个数据占四个字节,longlong*空间的一个数据自动占8个字节

memcpy_s(pData, sizeof(STUDENTS), pMem, sizeof(STUDENTS));

反序列化过程,把字节流转换成结构体类型,方便我们读取里面的数据

3.总结

序列化转换成字节流,能方便的进行保持和在网络进行传输。

反序列化能把字节流数据转换成结构化的数据,方便读取和识别。

首先要明白一个概念,如果用int*指针对,一块内存进行遍历这个指针每次加1

实际上是向前移动4个字节,类似的shor*每次移动2个字节,BYTE*每次移动一个字节。

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
结构体序列化反序列化是将结构体数据转换为字节流,以便在网络传输或存储中使用,然后再将字节流还原为原始结构体数据的过程。 在C++中,可以通过以下几种方式实现结构体序列化反序列化: 1. 使用二进制流进行序列化反序列化:可以使用std::ofstream和std::ifstream类来将结构体数据写入文件或从文件读取结构体数据。例如: ```cpp struct MyStruct { int a; float b; char c; }; void serialize(const MyStruct& data, const std::string& filename) { std::ofstream file(filename, std::ios::binary); file.write(reinterpret_cast<const char*>(&data), sizeof(MyStruct)); file.close(); } void deserialize(MyStruct& data, const std::string& filename) { std::ifstream file(filename, std::ios::binary); file.read(reinterpret_cast<char*>(&data), sizeof(MyStruct)); file.close(); } ``` 2. 使用JSON进行序列化反序列化:可以使用第三方库(如RapidJSON、nlohmann/json等)将结构体数据转换为JSON格式的字符串,然后再将JSON字符串转换回结构体数据。例如: ```cpp #include <iostream> #include <string> #include <nlohmann/json.hpp> struct MyStruct { int a; float b; char c; }; void serialize(const MyStruct& data, const std::string& filename) { nlohmann::json json_data; json_data["a"] = data.a; json_data["b"] = data.b; json_data["c"] = data.c; std::ofstream file(filename); file << json_data.dump(4); // 4为缩进级别 file.close(); } void deserialize(MyStruct& data, const std::string& filename) { std::ifstream file(filename); nlohmann::json json_data; file >> json_data; file.close(); data.a = json_data["a"]; data.b = json_data["b"]; data.c = json_data["c"]; } int main() { MyStruct original_data {42, 3.14f, 'A'}; serialize(original_data, "data.json"); MyStruct restored_data; deserialize(restored_data, "data.json"); std::cout << "Restored data: a = " << restored_data.a << ", b = " << restored_data.b << ", c = " << restored_data.c << std::endl; return 0; } ``` 以上是两种常见的结构体序列化反序列化的方式,具体选择哪种方式取决于你的需求和场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值