使用C ++序列化对象的首选方法

时间:2012-10-07 03:41:06

标签: c++ serialization

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

我有一个Task类,它有标题,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

3 个答案:

答案 0 :(得分:5)

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

如果你想自己实现序列化,我会有一个外部函数(可能是你班级的朋友)处理Task数组的序列化,而不是试图将数组序列化放入你的类。你可以做的是在你的类中添加一个serialiseObject()函数来序列化一个对象,然后从数组序列化函数中重复调用它。这是一个更清晰的设计,而不是将数组序列化也固定在类本身上。

一旦你进入序列化更复杂的C ++对象,尤其是包含引用和指针的C ++对象,序列化很快就会成为一个难题,你真的,真的想要使用一个很好的现有的第三方机制测试

那就是说,作为一个以C ++开发为生的人,我认为对boost的依赖是正常的,而不是我想要避免的第三方库。 Boost为您提供了许多额外的功能,我认为它是“我的标准库”的一部分。

答案 1 :(得分:2)

由于在C ++中没有用于序列化数据的标准,因此"首选"方式是你喜欢的。除非您的项目明确禁止使用第三方库,否则Boost是完全可以接受的,在这种情况下,您可以自行推出。

如果您选择自己滚动,请确保序列化程序和反序列化程序不会自行打开和关闭流。相反,调用者需要将流传递给它们。有关详细信息,请参阅this link

答案 2 :(得分:0)

我还使用了Google protobuf进行序列化。虽然不是严格的序列化,但Google protobuf可以非常高效,并且可以跨平台容纳数据。