2013-01-21 56 views
1

有一些消息结构。每一个都可以被序列化为一个字符串并从一个字符串中反序列化。 对于序列化部分,我使用超载运算符< <。但是对于序列化的部分,我想不出一个合适的方法来做到这一点。所以我使用一个类来解析字符串。最近,我遇到了boost序列化。我不知道它是否可以达到这个目的,或者有更好的主意。struct serialization

struct S 
{ 
    int32_t type; 
    double a; 
    int32_t b; 
    bool c; 
    std::string d; 

    friend std::ostream& operator<< (std::ostream& os, const S& s) 
    { 
    os << "{field1" << "=" << s.a << "|"; 
    os << "field2" << "=" << s.b << "|"; 
    os << "field3" << "=" << s.c << "|"; 
    os << "field4" << "=" << s.d << "}"; 

    return os; 
    } 
}; 

编辑:所以,我选择使用XML归档。但是,我有另一个问题。由于有几种类型的消息由字段msgtype分类。当反序列化时,如何指定哪个对象将要反序列化到?我需要手动搜索msgtype字段吗?

template <typename Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
    using boost::serialization::make_nvp; 
     ar & make_nvp("msgtype", type); 
     ar & make_nvp("field1", a); 
     ar & make_nvp("field2", b); 
     ar & make_nvp("field3", c); 
     ar & make_nvp("field4", d); 
    } 
+0

你想为反序列化做些什么? – 0x499602D2

+0

给出了一个字符串“{field1 = 1 | field2 = 2 | field3 = 1 | field4 = abc}”,它可以被反序列化为struct s。 –

+0

是人类可读的“字符串”吗? – Alex

回答

0

的boost ::系列化(据我记得)支持几表示:二进制,文本和XML。而且它不会很难(AFAIK)将它扩展到序列化到/从其他任何东西(例如JSON(也许它已经完成,我不知道))。

如果你想重新发明轮子,你可以遵循boost :: serialization的设计原则 - 这是相当清晰的结束(相对)很容易以简化的方式重新实现(不支持链接对象,这是大多数情况下不需要)。但看你的代码,我觉得你最好比自己的序列使用不便其他(已测试)...

很抱歉,但你的设计是远远好...

1

使用boost序列化:

http://www.boost.org/doc/libs/1_52_0/libs/serialization/doc/index.html

与此库将非常照顾一切的为您服务。通过这样做

void serialize(Archive & ar, const unsigned int version) 
{ 
    ar & a; 
    ar & b; 
    ar & c; 
    ar & d; 
} 

然后你就可以进行序列化和反序列化:

boost::archive::text_oarchive oa(ofs); 
    // write class instance to archive 
    oa << g; 

这:

boost::archive::text_iarchive ia(ifs); 
    // read class state from archive 
    ia >> newg; 
例如,你可以只添加此功能,你的结构

假设gnewg是你的结构。

然后,您也可以更改为binary_archive或其他节省空间或text_archive以节省可读性。

编辑:为了编辑,boost序列化将为您处理序列化。只要你序列化到一个档案,你只需要做相反的事情,从存档到创建档案的类型,boost会把所有的东西放回正确的位置。

我不熟悉NVP和XML中的东西,所以如果它不同于我很抱歉。

+0

同意 - '从不重新发明轮子'是一个重要的编程原理 – gerrytan

+0

我编辑了我的文章 –