5

Java には、オブジェクトをシリアル化するための非常に簡単な方法があります。C++ で同様のものを見つけることができませんでした。Boost Serializationと、ifstream と ofstream を使用した基本的なアプローチを見つけました。

タイトル、ID、ステータス、日付/時刻を持つ Task クラスがあります。クラス内にシリアル化関数を実装して、そのオブジェクトをバイナリ モードで保存したいと考えています。しかし、クラスの複数のインスタンスを単一のバイナリ ファイルに保存したいと考えています。たとえば、Task 配列です。

クラスにシリアル化メソッドを実装するのは良い方法でしょうか? 一度に 1 つずつシリアライズするだけで、ファイルを何度も開いたり閉じたりするので、ifstream/ofstream を使用するとうまくいきません。また、すべてのタスクは異なるファイルに保存されます。

Boost のシリアル化は問題ないように見えましたが、可能であればサードパーティの依存関係を避けるのが最善です。

これを達成する最良の方法は何ですか?

私のクラスヘッダー:

#ifndef TASK_H
#define TASK_H

class Task {
    public:
        enum Status { COMPLETED, PENDIENT };
        Task(std::string text);
        ~Task();
        // SETTERS
        void setText(std::string text);
        void setStatus(Status status);
        // GETTERS
        const std::string getText() const;
        const bool getStatus() const;
        const int getID() const;
        const int getCount() const;
        const std::string getDate() const;
        const std::string getTime() const;
        // DATE
        const int getDay() const;
        const int getMonth() const;
        const int getYear() const;
        // TIME
        const int getSecond() const;
        const int getMinute() const;
        const int getHour() const;
        // UTILS
        //serialize
        const void printFormatted() const;
        // OVERLOAD
        bool operator==( const Task &text2 ) const;
    private:
        void setID();
        static int sCount;
        int id;
        std::string text;
        Status status;
        tm *timestamp;
};

#endif
4

3 に答える 3

5

シリアル化する非常に単純なクラスが 1 つしかない場合、保存する必要がある少数のメンバーを書き出すシリアル化関数を実装することはそれほど難しくありません。クラスを示すコード例は示していませんが、少数のメンバーを使用すると、ポインターが含まれていない限り比較的簡単なはずです。シリアル化されたオブジェクトの数とそこに含まれるデータを書き出すと、目的にはおそらく十分です。

シリアル化を自分で実装したい場合は、配列のシリアル化をクラスに入れようとするのではなく、外部関数 (おそらくクラスの友人) に Task 配列のシリアル化を処理させます。できることはserialiseObject()、単一のオブジェクトをシリアル化する関数をクラスに追加し、配列のシリアル化関数から繰り返し呼び出すことです。これは、配列のシリアル化もクラス自体にボルトで固定するよりもはるかにクリーンな設計です。

もう少し複雑な C++ オブジェクト、特に参照とポインタを含むものをシリアル化すると、シリアル化はすぐに難しい問題になり、十分にテストされた既存のサードパーティのメカニズムを本当に、本当に使用したいと思うようになります。

そうは言っても、生計を立てるために C++ 開発を行っている者として、boost への依存は避けたいサードパーティ ライブラリではなく、普通のことだと考えています。Boost は非常に多くの追加機能を提供するので、私はそれを「私の標準ライブラリ」の一部と考えています。

于 2012-10-07T03:48:06.327 に答える
2

C++ にはデータをシリアル化するための標準がないため、「推奨される」方法はユーザーが好む方法です。プロジェクトでサードパーティ ライブラリの使用が明示的に禁止されている場合を除き、Boost は完全に受け入れられます。

独自にロールすることを選択した場合は、シリアライザーとデシリアライザーが独自にストリームを開いたり閉じたりしないようにしてください。代わりに、呼び出し元はストリームを渡す必要があります。詳細については、このリンクを参照してください。

于 2012-10-07T03:54:03.133 に答える
0

また、シリアライゼーションに Google protobuf を使用しました。厳密にはシリアライゼーションではありませんが、Google の protobuf は非常に効率的であり、データのコンテナーに対してクロス プラットフォームにすることができます。

于 2012-10-07T17:46:10.357 に答える