我在序列化char * string error C2228: left of '.serialize' must have class/struct/union
时遇到错误我可以使用std :: string然后从中获取const char *。但我需要char *字符串。
答案 0 :(得分:6)
错误信息说明了这一点,在序列化指向基本类型的指针的boost序列化中没有任何支持。
您可以在商店代码中执行以下操作:
int len = strlen(string) + 1;
ar & len;
ar & boost::serialization::make_binary_object(string, len);
并在加载代码中:
int len;
ar & len;
string = new char[len]; //Don't forget to deallocate the old string
ar & boost::serialization::make_binary_object(string, len);
答案 1 :(得分:1)
无法将指针序列化为boost::serialization
中的内容(我怀疑,也没有实际的方式)。指针只是一个内存地址,这些内存地址通常特定于对象的实例,而且,真正重要的是,该地址不包含停止序列化的信息。
你不能只对你的序列化器说:“嘿,从这个指针中拿出一些东西并序列化这个东西。我不在乎它的大小,只是这样做......”
首先,针对您的问题的最佳解决方案是使用char*
或您自己的字符串实现来包装std::string
。第二个意思是为char*
编写特殊的序列化例程,我怀疑,它通常会和第一个方法一样。
答案 2 :(得分:1)
试试这个:
struct Example
{
int i;
char c;
char * text; // Prefer std::string to char *
void Serialize(std::ostream& output)
{
output << i << "\n";
output << c << "\n";
// Output the length of the text member,
// followed by the actual text.
size_t text_length = 0;
if (text)
(
text_length = strlen(text);
}
output << text_length << "\n";
output << text << "\n";
};
void Input(std::istream& input)
{
input >> i;
input.ignore(1000, '\n'); // Eat any characters after the integer.
input >> c;
input.ignore(1000, '\n');
// Read the size of the text data.
size_t text_length = 0;
input >> text_length;
input.ignore(1000, '\n');
delete[] text; // Destroy previous contents, if any.
text = NULL;
if (text_length)
{
text = new char[text_length];
input.read(text, text_length);
}
};
由于指针不可移植,因此必须编写数据。
该文字称为可变长度字段。可变长度字段通常以两种数据结构输出(序列化):长度后跟数据OR数据,后跟终端字符。首先指定长度允许使用块读取。对于后一种数据结构,必须一次读取一个单元的数据,直到读取终端字符。 注意:后一种数据结构也意味着终端字符不能成为数据项集的一部分。
要考虑序列化的一些重要问题:
1.使用与平台无关的格式,例如数字的ASCII文本
2.如果平台方法不可用或不允许,请为数字定义完全规范,包括 Endianness 和最大长度。
3.对于浮点数,规范应将浮点数的分量视为必须遵守数字规范的单个数字(即指数,幅度和尾数)。
4.将固定长度记录更喜欢可变长度记录
5.首选序列化到缓冲区。然后,对象的用户可以创建一个或多个对象的缓冲区,并将缓冲区写为一个块(使用一个操作)。同样输入。
6. 首选使用数据库进行序列化。虽然这可能无法用于网络,但请尽一切努力让数据库管理数据。 数据库可能能够通过网络发送数据。