より良いアプローチとその理由について非常に一般的な質問があります。オブジェクト自体をシリアル化する責任を負うか、これを行うための別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_;
}
この場合、シリアライゼーションの詳細はすべてオーバーロードされた<<
and>>
演算子に入ります。
例 #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_;
}
注: ここでは<<
and>>
演算子を例として提供していますが、必ずしもデータをテキストとして保存する必要があるという意味ではありません。このメソッドは、バイナリ形式を使用するserialize
/メソッドに置き換えることもできます。deserialize