2

より良いアプローチとその理由について非常に一般的な質問があります。オブジェクト自体をシリアル化する責任を負うか、これを行うための別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_;
}

この場合、シリアライゼーションの詳細はすべてオーバーロードされた<<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

4

1 に答える 1

1

簡単な答え: IMHO、各エンティティ クラスの Reader クラスの特殊化は、より良い解決策です。

長い答え:

おそらくシリアライゼーションはあなたのエンティティ (すなわち: ヘッダー) に関係するべきではないので、この機能はそれらに属すべきではありません (ウィキペディアの単一責任原則を参照してください)。

一方、エンティティークラスについてすべて知っている外部シリアライザーは、システム内で許容できない密結合です (将来、読みやすさと保守性に深刻な影響が及ぶでしょう)。

したがって、私の提案は、特定のエンティティ クラス (つまり、HeaderReader/HeaderWriter) をシリアル化/逆シリアル化する方法だけを知っているリーダー/ライターの一般化を作成することです。

[]の、

于 2012-11-28T03:22:36.477 に答える