由于引入了面向对象的概念,C++ 中的类(结构体)不再是与 C 中结构体类似的 POD(Plain Old Data)类型。因此在进行网络通信或者外存存储时需要单独进行序列化以及反序列化处理。
遗憾的是,C++ 并没有提供类似于 Java 中 ObjectInputStream
和 ObjectOutputStream
这样的序列化手段,不过我们可以通过 jsoncpp 等外部库将类转化为 json 字符串,在进行网络传输时再将 json 字符串转化为网络字节流。
jsoncpp 下载路径为https://github.com/open-source-parsers/jsoncpp
下载后运行 jsoncpp 文件夹下的 amalgamate.py 脚本,生成的 dist 目录即包含了我们所需要的头文件和源文件,直接复制到项目中即可使用。
通过 jsoncpp 实现嵌套类与 json 字符串的相互转换
#include <iostream>
#include <string>
#include "json/json.h"
using namespace std;
/* 内层类 */
class Inner {
private:
string m_in_id;
string m_in_password;
public:
Inner() = default;
Inner(string in_id, string in_password) : m_in_id(std::move(in_id)), m_in_password(std::move(in_password)) {
}
explicit Inner(const string &json_str) {
Json::Value value;
Json::String error;
Json::CharReaderBuilder builder;
unique_ptr<Json::CharReader> reader(builder.newCharReader());
if (!reader->parse(json_str.c_str(), json_str.c_str() + json_str.length(), &value, &error)) {
cout << "construct from json error, error = " << error << ", json = " << json_str << endl;
} else {
m_in_id = value["m_in_id"].asString();
m_in_password = value["m_in_password"].asString();
}
}
Json::Value toJson() {
Json::Value value;
value["m_in_id"] = m_in_id;
value["m_in_password"] = m_in_password;
return value;
}
string toJsonStr() {
Json::Value value;
value["m_in_id"] = m_in_id;
value["m_in_password"] = m_in_password;
Json::FastWriter writer;
string jsonStr = writer.write(value); // 无格式json字符串
return jsonStr;
}
};
/* 外层类 */
class Outer {
private:
string m_out_id;
string m_out_password;
Inner m_inner;
public:
Outer() = default;
Outer(string out_id, string out_password, string in_id, string in_password) : m_out_id(std::move(out_id)),
m_out_password(std::move(out_password)),
m_inner(std::move(in_id), std::move(in_password)) {
}
Outer(const string &json_str) {
Json::Value value;
Json::String error;
Json::CharReaderBuilder builder;
unique_ptr <Json::CharReader> reader(builder.newCharReader());
if (!reader->parse(json_str.c_str(), json_str.c_str() + json_str.length(), &value, &error)) {
cout << "construct from json error, error = " << error << ", json = " << json_str << endl;
} else {
m_out_id = value["m_out_id"].asString();
m_out_password = value["m_out_password"].asString();
Json::FastWriter writer;
m_inner = Inner(writer.write(value["m_inner"]));
}
}
string toJsonStr() {
Json::Value value;
value["m_out_id"] = m_out_id;
value["m_out_password"] = m_out_password;
value["m_inner"] = m_inner.toJson();
Json::FastWriter writer;
string jsonStr = writer.write(value); // 无格式json字符串
return jsonStr;
};
};
int main() {
string out_json_str;
Outer outer_old("111", "111", "222", "222");
cout << (out_json_str = outer_old.toJsonStr());
Outer outer_new(out_json_str);
cout << outer_new.toJsonStr();
}
atreus@MacBook-Pro % clang++ -I ./json/json.h main.cpp jsoncpp.cpp -o main -std=c++11
atreus@MacBook-Pro % ./main
{
"m_inner":{
"m_in_id":"222","m_in_password":"222"},"m_out_id":"111","m_out_password":"111"}
{
"m_inner":{
"m_in_id":"222","m_in_password":"222"},"m_out_id":"111","m_out_password":"111"}
atreus@MacBook-Pro %