在 C++ 中,我想序列化我的 class 变量,但它有两个问题
in c++, i want to serialize my class variables, but it has two problem
我想序列化我的 class 但我有两个问题。
首先,我会展示我的 class。
namespace CommonData
{
enum DataType { SHPERICAL, COORDINATE, VIEW };
class Data
{
public:
virtual int serialize(char** param) = 0;
protected:
//every size is byte unit
int initialize(char** param, int size);
int fill(char** param, int start, int size, void* src);
private:
DataType _type;
};
class CoordinateData : public Data
{
public:
int serialize(char** param) override;
private:
int _x, _y, _z;
};
};
这是cpp代码
int Data::initialize(char** param, int size)
{
*param = new char[size];
cout << "size : " << size << endl;
return fill(param, 0, sizeof(DataType), &_type);
}
int Data::fill(char** param, int start, int size, void* src)
{
char* p = reinterpret_cast<char*>(src);
int i = 0;
while(i < size)
{
cout << "i : " << i << endl;
cout << "*(p + i) : " << (int)*(p + i) << endl;
*param[start + i] = *(p + i);
cout << "*param[start + i] : " << (int)*param[start + i] << endl;
i++;
cout << "==============" << endl;
}
return start + size;
}
int CoordinateData::serialize(char** param)
{
int end = 0;
end = initialize(param, sizeof(CoordinateData));
return end;
}
所以如果我像这样开始主要代码
int main()
{
char* arr = nullptr;
CommonData::CoordinateData _coor(1, 2, 3);
int size = _coor.serialize(&arr);
}
控制台输出是这样的
size : 20
i : 0
*(p + i) : 1
*param[start + i] : 1
==============
i : 1
*(p + i) : 0
*param[start + i] : 0
==============
i : 2
*(p + i) : 0
我的第一个问题是为什么 CoordinateData class 的大小是 20?我预测它将是 16(enum DataType _type, int _x, _y, _z -> 4 * 4 = 16 byte)
其次是填充功能不起作用。我删除了一些打印功能,但是当我检查访问 *param[start + i = 2] 时,可能有垃圾值,但是当我 运行 主代码时,它们就这样完成了。
我听说 c++ 可以在每个代码中访问原始内存地址,而无需保证程序的安全性。所以它不能抛出内存错误,我认为 char* arr 是堆内存,所以它不会在代码或数据区域的内存中访问,但它只是关闭了。为什么会这样?
operator[]
的优先级高于 operator*
。
换句话说你需要做
(*param)[start + i] = *(p + i);
我想序列化我的 class 但我有两个问题。
首先,我会展示我的 class。
namespace CommonData
{
enum DataType { SHPERICAL, COORDINATE, VIEW };
class Data
{
public:
virtual int serialize(char** param) = 0;
protected:
//every size is byte unit
int initialize(char** param, int size);
int fill(char** param, int start, int size, void* src);
private:
DataType _type;
};
class CoordinateData : public Data
{
public:
int serialize(char** param) override;
private:
int _x, _y, _z;
};
};
这是cpp代码
int Data::initialize(char** param, int size)
{
*param = new char[size];
cout << "size : " << size << endl;
return fill(param, 0, sizeof(DataType), &_type);
}
int Data::fill(char** param, int start, int size, void* src)
{
char* p = reinterpret_cast<char*>(src);
int i = 0;
while(i < size)
{
cout << "i : " << i << endl;
cout << "*(p + i) : " << (int)*(p + i) << endl;
*param[start + i] = *(p + i);
cout << "*param[start + i] : " << (int)*param[start + i] << endl;
i++;
cout << "==============" << endl;
}
return start + size;
}
int CoordinateData::serialize(char** param)
{
int end = 0;
end = initialize(param, sizeof(CoordinateData));
return end;
}
所以如果我像这样开始主要代码
int main()
{
char* arr = nullptr;
CommonData::CoordinateData _coor(1, 2, 3);
int size = _coor.serialize(&arr);
}
控制台输出是这样的
size : 20
i : 0
*(p + i) : 1
*param[start + i] : 1
==============
i : 1
*(p + i) : 0
*param[start + i] : 0
==============
i : 2
*(p + i) : 0
我的第一个问题是为什么 CoordinateData class 的大小是 20?我预测它将是 16(enum DataType _type, int _x, _y, _z -> 4 * 4 = 16 byte)
其次是填充功能不起作用。我删除了一些打印功能,但是当我检查访问 *param[start + i = 2] 时,可能有垃圾值,但是当我 运行 主代码时,它们就这样完成了。
我听说 c++ 可以在每个代码中访问原始内存地址,而无需保证程序的安全性。所以它不能抛出内存错误,我认为 char* arr 是堆内存,所以它不会在代码或数据区域的内存中访问,但它只是关闭了。为什么会这样?
operator[]
的优先级高于 operator*
。
换句话说你需要做
(*param)[start + i] = *(p + i);