序列化包含char *的结构

时间:2010-04-28 13:49:14

标签: c++ serialization boost

我在序列化char * string error C2228: left of '.serialize' must have class/struct/union时遇到错误我可以使用std :: string然后从中获取const char *。但我需要char *字符串。

3 个答案:

答案 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. 首选使用数据库进行序列化。虽然这可能无法用于网络,但请尽一切努力让数据库管理数据。 数据库可能能够通过网络发送数据。