Сериализация std::string

Собственно, есть класс:

class MyClass{
   const uint64_t UUID;
   const std::string Version;
   const uint32_t blocksize;
}

Как его записать в файл?


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

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

Ну, я бы делал примерно так... Я переделал в struct, чтобы не возиться с доступом, и убрал const с полей - потому как записать константные поля легко, а вот читать - нет: не следует менять константный объект. Разве что если чтение выполняется в конструкторе, как инициализация...

struct MyClass
{

    MyClass (uint64_t uuid, const char * s, uint32_t b):UUID(uuid),
             Version(s),blocksize(b){}

    uint64_t UUID;
    std::string Version;
    uint32_t blocksize;

    ostream& write(ostream& os) const;
    istream& read(istream& is);
};

ostream& MyClass::write(ostream& os) const
{
    os.write((char*)&UUID,sizeof(UUID));
    size_t s = Version.size();
    os.write((char*)&s,sizeof(s));
    os.write(Version.c_str(),s);
    os.write((char*)&blocksize,sizeof(blocksize));
    return os;
}

istream& MyClass::read(istream& is)
{
    is.read((char*)&UUID,sizeof(UUID));
    size_t s;
    is.read((char*)&s,sizeof(s));
    Version.resize(s);
    is.read(Version.data(),s);
    is.read((char*)&blocksize,sizeof(blocksize));
    return is;
}

Ну, и как пример использования:

int main(int argc, const char * argv[])
{
    MyClass a(1,"xyz",3);
    MyClass b(4,"s",8);

    ofstream out("data",ios::binary);
    a.write(out);
    out.close();

    ifstream in("data",ios::binary);
    b.read(in);
    in.close();

    cout << b.UUID << endl;
    cout << b.Version << endl;
    cout << b.blocksize << endl;
}

Сами проверьте, что все работает.

Как вариант для компиляторов, не желающих работать с .data() -

Version.resize(s);
is.read(Version.data(),s);

заменить на

char * buf = new char[s];
is.read(buf,s);
Version.assign(buf,buf+s);
delete[] buf;
→ Ссылка