IAE*_*IAE 4 c++ file-io serialization file
这是教授在他的剧本中向我们展示的内容.我没有在我编写的任何代码中使用此方法.
基本上,我们采用一个类或结构,并重新解释它并保存整个结构,如下所示:
struct Account
{
Account()
{ }
Account(std::string one, std::string two)
: login_(one), pass_(two)
{ }
private:
std::string login_;
std::string pass_;
};
int main()
{
Account *acc = new Account("Christian", "abc123");
std::ofstream out("File.txt", std::ios::binary);
out.write(reinterpret_cast<char*>(acc), sizeof(Account));
out.close();
Run Code Online (Sandbox Code Playgroud)
这会产生输出(在文件中)
ÍÍÍÍChristian ÍÍÍÍÍÍ ÍÍÍÍabc123 ÍÍÍÍÍÍÍÍÍ
Run Code Online (Sandbox Code Playgroud)
我糊涂了.这种方法是否真的有效,或者它是否会导致UB,因为神奇的事物发生在各个编译器的奇思妙想的类和结构中?
Jam*_*lis 10
它实际上不起作用,但它也不会导致未定义的行为.
在C++中,将任何对象重新解释为数组是合法的char,因此这里没有未定义的行为.
但是,如果类是POD(实际上,如果类是简单的C风格的结构)并且是自包含的(即,结构没有指针数据成员),则结果通常仅可用.
在这里,Account不是POD,因为它有std::string成员.内部std::string是实现定义的,但它不是POD,它通常有指针指向存储实际字符串的堆分配块(在您的具体示例中,实现使用小字符串优化,其中值字符串存储在std::string对象本身中).
有几个问题:
你并不总能得到你期望的结果.如果你有一个更长的字符串,那么std::string将使用在堆上分配的缓冲区来存储字符串,因此你最终只是序列化指针,而不是指向字符串.
您实际上无法使用此处序列化的数据.您不能只是将数据重新解释为Account并期望它可以工作,因为std::string构造函数不会被调用.
简而言之,您不能使用此方法来序列化复杂的数据结构.
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |