Сохранение и загрузка состояния класса из и в steam c

#c #serialization #io #stream #binary

Вопрос:

Я пытаюсь понять, как сохранить и загрузить состояние объектов в двоичный поток. Для контекста, в настоящее время у нас есть эта рабочая, но только реализация «сохранить в файл». Однако мы хотим, чтобы сериализация выполнялась в памяти, чтобы лучше взаимодействовать с некоторыми библиотеками распараллеливания. Я надеюсь, что это будет довольно просто, но моя текущая реализация мало что дает — может ли кто-нибудь определить, что я делаю не так?

 
class ForSerializationAsBinary {
public:
    ForSerializationAsBinary() = defau<

    explicit ForSerializationAsBinary(int number)
            : number_(number) {}

    std::ostringstream toBinaryStream() {
        std::ostringstream out(std::ios::binary);
        out.write((char *) amp;number_, sizeof(int));
        return out;
    }

    static void fromBinaryStream(ForSerializationAsBinary amp;obj, std::ostringstream amp;os) {
        int n;
        std::istringstream is(std::ios::binary);
        is.basic_ios<char>::rdbuf(os.rdbuf());
        is.read((char *) amp;n, sizeof(int));
        std::cout << "n: " << n << std::endl;
        obj.number_ = n;
    }

    int number_;
};

TEST(Serialisation, SimpleSerialization) {
    ForSerializationAsBinary serializationAsBinary(4);
    auto o = serializationAsBinary.toBinaryStream();
    ForSerializationAsBinary loaded;
    ForSerializationAsBinary::fromBinaryStream(loaded, o);
    std::cout << "loaded.number_: " << loaded.number_ << std::endl;

}

 

И текущая выходная мощность теста

 n: 0
loaded.number_: 0
 

Ответ №1:

Похоже, я нашел ответ : просто используйте a std::stringstream вместо версий o или i :

 
class ForSerializationAsBinary {
public:
    ForSerializationAsBinary() = defau<

    explicit ForSerializationAsBinary(int number)
            : number_(number) {}

    std::stringstream toBinaryStream() {
        std::stringstream out(std::ios::binary);
        out.write((const char *) amp;number_, sizeof(int));
        return out;
    }

    static void fromBinaryStream(ForSerializationAsBinary amp;obj, std::stringstream amp;os) {
        int n;
        os.read((char *) amp;n, sizeof(int));
        std::cout << "n: " << n << std::endl;
        obj.number_ = n;
    }

    int number_;
};