序列化c ++类

时间:2011-04-11 10:55:43

标签: c++ visual-c++ iostream

  

可能重复:
  How to serialize in c++ ?

我有一个班级

    Class Person
    {
      int age;
      char *name;

      char* Serialize()
      {
        //Need to convert age and name to char* eg:21Jeeva
      }
      void DeSerialize(char *data)
      {
        //Need to populate age and name from the data
      }
    };

在C#中我们可以使用MemoryStream,BinrayWriter / BinaryReader来实现这一点。在c ++的某个地方,我发现我们可以使用iostream来实现它。但无法得到一个恰当的例子。

代码的目的是在调用serialize之后我将通过套接字发送数据并在接收结束时调用DeSerialize来填充成员。

2 个答案:

答案 0 :(得分:3)

您可以查看Boost.Serialization。如果您只需要基于iostream的简单文本序列化,则可能需要重载流提取运算符。对于序列化,这可能如下所示:

std::ostream & operator<<(std::ostream & stream, const Person & person) {
    stream << person.age << " " << person.name;
    return stream;
}

你必须使这个功能成为Person的朋友,才能发挥作用。

对于反序列化,您可以使用:

std::istream & operator>>(std::istream & stream, Person & person) {
    stream >> person.age >> person.name;
    return stream;
}

使用这些,您可以执行以下操作:

Person fred;
fred.name = "Fred";
fred.age = 24;

std::stringstream buffer;
buffer << fred << std::endl;

Person fred_copy;
buffer >> fred;

您可以找到一个小的工作示例here

重载这些运算符的优点是,您可以使用std::copystd::ostream_iterator在一个语句中序列化整个人员集合。

答案 1 :(得分:0)

您可以使用以下包装器将任何数据类型转换为字符流:

template<class TYPE>
string ToChar (const TYPE& value)
{
  stringstream ss;
  ss << value;
  return ss.str();
}

您可以按照自己的方式使用string对象;比如使用c_str()转换为char流或复制到数组等等。