我想用c ++序列化对象。起初我尝试了一个简单的解决方案,我重载了类的<<
和>>
运算符来序列化;通过这种方式,我可以选择witch属性来序列化为strinstream,然后我可以将相同的stringstream反序列化为稍后相同类型的另一个对象的属性。
这一直有效,直到我意识到如果要序列化的类包含指向其他类的指针,那么我还需要重载它们的>>
和<<
运算符。
所以我开始考虑如果我将对象序列化并通过char遍历char(1个字节)然后将结果保存到字符串中。然后稍后取该字符串并将其重新解释为原始类。通过这种方式,我可以序列化包含任何类型信息的任何类,而无需关心它包含的内容,也不会重载任何操作符。
我实现了第二种方法,它接缝是好的,但是它呢?
#include <cstdlib>
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
class B
{
public:
B(int one , int two)
{
this->one = one;
this->two = two;
}
int one;
int two;
};
class A
{
public:
A(int one , int two, B b)
{
this->one = one;
this->two = two;
classB= new B(b);
}
int one;
int two;
B* classB;
};
int main(int argc, char *argv[])
{
B b(3,4);
A* a = new A(1,2, b);
//Serializing 'a'
char v[sizeof(A)];
for (int i =0 ;i<sizeof(A);i++)
{
v[i] = (reinterpret_cast<char*>(a)[i]);
}
char* cp = (char*)malloc(sizeof(char) * sizeof(A));
for (int i =0 ;i<sizeof(A);i++)
{
cp[i] = v[i];
}
A* aa = reinterpret_cast<A*>(cp);
cout << aa->one << endl;
cout << aa->two<< endl;
cout << aa->classB->one<< endl;
free(cp);
system("PAUSE");
return EXIT_SUCCESS;
// OUTPUT is as expect:
1
2
3
}
那你觉得怎么样?你预见到第二种方法有任何复杂性吗?请记住,我是C ++的新手,我正在努力发展工作理论。
答案 0 :(得分:0)
你提到的第二种方法(基本上只是编写和读取数据结构的原始字节)不适用于存储指针的东西。为什么?以这种方式看待它:
struct S
{
int* i;
};
S s;
假设您通过执行以下操作来编写s
的原始字节:file.write((char*)&s, sizeof(s))
。这将写入指针i
的原始值,但不会在i
中写入 stored 值(即*i
返回的值)。如果您尝试重新加载数据结构,i
将指向可能无效的内存区域(因为它是存储在您保存/加载的i
中的地址 ,而不是地址的内容。)