【问题标题】:serialization a class in C++ [closed]在C++中序列化一个类[关闭]
【发布时间】:2012-11-30 12:55:45
【问题描述】:

我需要一种将代码中的类序列化为字符串的方法。稍后,使用该字符串我需要填充该类的一个实例。

即

enum AlarmStatus
{
   Clear=0,
   Active
};

class AlarmInfo
{
public:
std::string S;
int I;
AlarmStatus alarmStatus;
void setAlarmStatus(AlarmStatus alarmStatus);
AlarmStatus getAlarmStatus();
};

有什么想法可以在代码中做到这一点吗?我知道 boost 有可以序列化一个类的 boost/archive/ 库,但它不是“HeaderOnly 库”?有没有只有 Header 的库?

谢谢

【问题讨论】:

  • 如果你想完全自己做,你可以重载operator<< 来序列化和operator>> 反序列化——但是去/来自一个流,而不是直接的字符串(使用 stringstream当你想要一个字符串时)。不过从Boost serialization 开始可能更干净。
  • 我通过在页面顶部的搜索栏中输入“serialize [c++]”找到了一些。您已经尝试过哪些?
  • 为什么这个问题被否决了?我做了我的研究,我确实找到了几个库,我只是认为它应该是简单的,不需要库来这样做

标签: c++ serialization


【解决方案1】:

C++ 没有反射。因此,像其他一些编程语言提供的功能,如 C# 的BinaryFormatter、XmlSerializer 或DataContractSerializer 是不可能实现的。你必须自己实现序列化。

(我个人认为这是一件好事。您的文件格式不应该与您的实现如此耦合,因为一段时间后您会想要更改实现。然后发现您搞砸了,因为您的文件格式是根据该代码定义的)

【讨论】:

    【解决方案2】:

    创建一个往返串行代码并调用它

    struct Person{
      string name;
      int age;
    
      void toSerial(ostream& stream){ stream << name << age; }
      void fromSerial(istream& stream){  stream >> name >> age; }
    }
    
    int main(){
      Person person;
      //save to data.txt
      ofstream fileOut("data.txt");      
      person.toSerial(fileOut);
      fileOut.close();
    
      //load from data.txt
      ifstream fileIn("data.txt");
      person.fromSerial(fileIn);
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2010-09-19
      相关资源
      最近更新 更多