C++ 哪个类应该负责序列化?

C++ 哪个类应该负责序列化?,c++,oop,serialization,class-design,C++,Oop,Serialization,Class Design,我有一个非常普遍的问题,关于什么是更好的方法以及为什么:让一个对象负责序列化自己,或者让一个单独的读取器和编写器类来完成这项工作 这是一个例子。我有一个文件格式,它由一个头和一系列对象组成 示例#1-嵌入式序列化 注意:我提供了操作符作为示例,这并不意味着我一定要将数据存储为文本。这种方法也可以被使用二进制格式的序列化/反序列化方法所取代。简短回答:IMHO,为您的每个实体类专门化Reader类将是更好的解决方案 长答覆: 可能序列化不应该是您的实体(即:Header)所关心的问题,因此此功能

我有一个非常普遍的问题,关于什么是更好的方法以及为什么:让一个对象负责序列化自己,或者让一个单独的
读取器
编写器
类来完成这项工作


这是一个例子。我有一个文件格式,它由一个头和一系列对象组成

示例#1-嵌入式序列化
注意:我提供了
操作符作为示例,这并不意味着我一定要将数据存储为文本。这种方法也可以被使用二进制格式的
序列化
/
反序列化
方法所取代。

简短回答:IMHO,为您的每个实体类专门化Reader类将是更好的解决方案

长答覆:

可能序列化不应该是您的实体(即:Header)所关心的问题,因此此功能不应该属于它们(参见Wikipedia)

另一方面,了解所有实体类的外部序列化程序在您的系统中是不允许的紧耦合(可读性和可维护性将在将来受到严重影响)

因此,我的建议是创建只知道如何序列化/反序列化特定实体类(即:HeaderReader/HeaderWriter)的读者/作者泛化


[]的读取器/写入器必须与每门课都是朋友?这要看情况而定,但我明白你的意思。下面是一个例子,它们不是:
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_;
}
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_;
}