Прочитать объект из файла прямо в его методе C++

Мне нужно записать записывать/считывать объект из файла, используя функции fwrite() и fread(). Могу ли я создать такие методы в классе:

class Foo
{
public:

    void saveToFile(const char *filename) const
    {
        FILE *file = fopen(filename, "wb");

        //Функция fwrite() не модифицирует данные,
        //на которые указывать this. Все должно быть хорошо.
        fwrite(this, sizeof(*this), 1, file);

        fclose(file);
    }

    void loadFromFile(const char *filename)
    {
        FILE *file = fopen(filename, "rb");

        //Функция fread() модифицирует данные,
        //на которые указывает this. 
        //Это происходит прямо в методе класса,
        //который сейчас будет читаться из файла.
        //Безопасно ли это делать?
        fread(this, sizeof(*this), 1, file);

        fclose(file);
    }

};

И рассчитывать, что все будет работать хорошо? В коде могут быть упущены и другие моменты, но меня интересует только чтение в память по указателю this прямо в методе класса. Можно ли так делать?


Ответы (1 шт):

Автор решения: jokerbot

В пределах одной машины проблем быть не должно для POD структур. Но при передаче на другие могут возникнуть две проблемы: может различаться выравнивание полей и порядок байт. Первая проблема решается перебором элементарных полей и вызовом функции сериализации/десериализации для каждого. Вторая решается переносимой реализацией этих функций сериализации/десериализации. К сожалению, в С++ нет стандартных средств управления порядком байт, но можно использовать функции операционной системы типа htonll . Нормального способа обойти все элементарный поля тоже нет. Рекомендую гуглить c++ serialization

→ Ссылка