哪个类应该负责序列化?

时间:2012-11-28 01:37:32

标签: c++ oop serialization class-design

我有一个非常普遍的问题,关于什么是更好的方法和原因:让一个对象负责序列化自己或者有一个单独的ReaderWriter类来做这个?


这是一个例子。我有一个文件格式,包括标题和一系列对象。

示例#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方法替换。

1 个答案:

答案 0 :(得分:0)

简短回答:恕我直言,每个实体类的Reader类专业化将是一个更好的解决方案。

答案很长:

可能序列化不应该是您的实体的关注点(即:Header),因此该功能不应属于它们(请参阅维基百科中的single responsability principle)。

另一方面,了解所有实体类的外部串行器是系统中不可接受的紧耦合(可读性和可维护性将在未来受到严重影响)。

所以,我的建议是创建读者/作者概括,只知道如何序列化/反序列化特定的实体类(即:HeaderReader / HeaderWriter)。

[]的,