如果我把一个结构的int成员投向char*来序列化它,那么在反序列化时,我是否应该把它投向int*类型?

问题描述 投票:1回答:1

这个结构的date有两个 int 类型,结构的写函数在其上使用 reinterpret_cast<char*>() 将其存储在磁盘上。要从磁盘上再次读取并将其存储为一个文件。int 结构的变量,我是不是应该 reinterpret_castint day 变量 <int*> 适当地存储它? 像这样。

os.write(reinterpret_cast<char*>(&day),sizeof(day)); //to cast it into char* to store it in file

并且,要像这样反序列化。

is.read(reinterpret_cast<int*>(&day),sizeof(day)); //to cast it into char* to read it from file

而不是:

is.read(reinterpret_cast<char*>(&day),sizeof(day)); //which just converts it back to char* to read from file

原因是我希望能够对它进行运算。int day.

这是我的代码。

struct date{
    int day;
    string month;
    int year;

    void read(istream &is) // to deserialize date and read it from disk
    {
        is.read(reinterpret_cast<char*>(&day), sizeof(day));
        size_t size;
        if (is.read(reinterpret_cast<char*>(&size), sizeof(size)))
        {
            month.resize(size);
            is.read(&month[0], size);
        }
        is.read(reinterpret_cast<char*>(&year), sizeof(year));
    }

    void write(ostream &os) const //to serialize struct date
    {
        os.write(reinterpret_cast<const char*>(&day), sizeof(day));
        size_t size = month.size();
        os.write(reinterpret_cast<const char*>(&size), sizeof(size));
        os.write(month.c_str(), size);
        os.write(reinterpret_cast<const char*>(&year), sizeof(year));
    }
};
c++ pointers deserialization
1个回答
2
投票

你的代码很好,因为它是,没有理由担心 day (或 year)被解释为任何其他的东西,而不是 int 即被声明为。

在对 is.reados.write,你唯一要投的是(对一 char* 指针)是传递的 地址day 变量。这和下面的参数(sizeof(day))告诉这些调用要读写适当数量的字节(a char 总是 一个字节sizeof 操作符给出了以 字节数)成from给定的地址。

所以,如果(很常见),如果一个 int 在你的编译器平台上是4个字节,那么4个字符将被从流中读取并放置在给定的地址上--整数的4个 "组件 "字节将被放置到为该整数分配的内存中。

投放到 char * 是必须的,因为STL定义了 read()write() 函数都会取这样一个指针。这是因为流是在逐个字符的基础上实现的,因此,如果要读取任何其他类型的变量,你需要抛出它的地址,并提供该类型的相关大小。

© www.soinside.com 2019 - 2024. All rights reserved.