5

Java 有一种非常简单的方法来序列化对象。在 C++ 中找不到类似的东西。我找到了Boost Serialization,以及使用 ifstream 和 ofstream的基本方法。

我有一个任务类,它有一个标题、ID、状态和日期/时间。我想在类中实现一个序列化函数,以二进制模式保存该对象。但我想将类的多个实例保存在一个二进制文件中。比方说,一个任务数组。

在类上实现序列化方法会是一个好方法吗?它一次只会序列化一个,如果我使用 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

如果你只有一个非常简单的类来序列化,那么实现一个序列化函数来写出你需要保存的少数成员并不难。您没有给出显示您的类的代码示例,但是只要不涉及指针,它应该相对容易一些成员。如果您写出序列化的对象数量,然后是其中包含的数据,那么这可能足以满足您的目的。

如果您想自己实现序列化,我将有一个外部函数(可能是您班级的朋友)处理 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 回答