#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_;
};