gpt4 book ai didi

C++ 流序列化

转载 作者:搜寻专家 更新时间:2023-10-31 01:19:50 25 4
gpt4 key购买 nike

目前我正在尝试实现某种对象流,类似于java中存在的结构。

使用 "Stream Socket API" by Rob Tougher使用流插入很容易 operator<< .

这会导致每个可序列化对象都需要每个类以相同方式重载相同运算符的问题。

例子:

class A
{
protected:
int value;

friend ostream& operator <<( ostream& in, const A& obj );
};

class B
{
protected:
float value;

friend ostream& operator <<( ostream& in, const B& obj );
};

ofstream& operator<< (ofstream& in, const A& obj)
{
return (in << obj.value);
}

ofstream& operator<< (ofstream& in, const B& obj)
{
return (in << obj.value);
}

嗯。这很容易并且有效。现在我正在考虑是否有可能以某种方式简化和自动化此序列化过程。

我已经反复思考如何使用模板和宏的某种组合来完成这件事。使用 typeid (RTTI) 会部分工作,但是当您只知道 typeid 时,您需要在类型中转换一个值,这会失败。这根本不可能。

是否真的没有其他解决方案可以简单地让用户实现每个 operator<< ?我是不是想得太远了,解决方案很简单?

否则,在我尝试和思考的所有方法中,问题都在我需要在编译时不知道类名时重新实例化对象的地方结束。

任何想法都会受到赞赏。

附言:使用fwrite(item, sizeof(item), 1, handle);也不是解决方案。完全不独立于平台。

最佳答案

Java 序列化依靠反射来自动发现和序列化类字段。在 C++ 中,您的选择是:

  1. 为每个类手动编写输入和输出函数。 boost::serialization 使用这种方法。
  2. 使用单独的语言声明可序列化实体,并使用自动生成的输入/输出运算符将该语言编译为 C++。 CORBA、protobuf、ZeroC ICE 和 thrift 都使用这种方法。
  3. 理论上您可以使用 C++ 本身作为定义语言,但 C++ 很难解析,我不知道有任何序列化框架会尝试这样做。也许现在 clang 实际上可以编译真正的程序,有人可能会尝试。
  4. 使用宏声明每个可序列化实体,并使用不同的宏定义对每个 header 进行两次编译(一次用于声明类,一次用于创建序列化器)。我已经看到它在我必须维护的封闭源代码中完成,结果非常丑陋和不灵活,所以我建议不要这样做。

关于C++ 流序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5613035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com