我有一个非常普遍的问题,关于什么是更好的方法以及为什么:让一个对象负责序列化自己或有一个单独的Reader
和Writer
类来做到这一点?
这是一个插图。我有一个由标题和一系列对象组成的文件格式。
示例 #1 - 嵌入式序列化
class Header
{
friend std::ostream& operator<< (std::ostream& out, const Header& header);
friend std::istream& operator>> (std::istream& in, Header& header);
}
class Object
{
friend std::ostream& operator<< (std::ostream& out, const Object& object);
friend std::istream& operator>> (std::istream& in, Object& object);
}
class Reader
{
void readHeader(Header& header) { ifs_ << header; }
void readObject(Object& object) { ifs_ << object; }
private:
ifstream ifs_;
}
class Writer
{
void writeHeader(Header const& header) { header >> ofs_ }
void writeObject(Object const& object) { object >> ofs_ }
private:
ofstream ofs_;
}
在这种情况下,所有序列化细节都进入重载的<<
和>>
运算符。
示例 #2 - 外部序列化
class Header
{
}
class Object
{
}
class Reader
{
void readHeader(Header& header) { // serialization details go here }
void readObject(Object& object) { // serialization details go here }
private:
ifstream ifs_;
}
class Writer
{
void writeHeader(Header const& header) { // serialization details go here }
void writeObject(Object const& object) { // serialization details go here }
private:
ofstream ofs_;
}
注意:我提供<<
和>>
运算符只是作为示例,并不意味着我一定要将数据存储为文本。这种方法也可以用使用二进制格式的serialize
/方法代替。deserialize