【问题标题】:c++ Data serialization from templated classc ++模板类的数据序列化
【发布时间】:2023-03-30 03:59:01
【问题描述】:

我有一种情况,我想定义一个模板类,它能够获得几种不同的基本类型,如intchar arraydata structurestring。然后我想使用一种方法来序列化和传输数据,该方法接受一个指向字符数组的指针和一个长度参数。

sendData(const void *, size_t);

template <typename T>
T myClass(T data)
{
   // cast data to char array; calculate the length if not given
   sendData(data, length);
}

投射数据参数和计算大小的最佳方法是什么?模板专业化是处理我们只希望为模板预定义数据类型列表的情况的最佳选择吗?我正在寻找一种使用本机 C++ 且没有外部序列化库的解决方案,并且还避免使用 reinterpret_cast。谁能提供我基本的实现示例?

在接收端,有没有办法让接收端在反序列化之前确定并验证接收到的数据是否具有预期的类型?

【问题讨论】:

  • 您不能使用std::string 或任何其他具有内部内存分配的数据来执行此操作。您也不能依赖在不同机器/系统/编译器上具有相同内存布局的数据。

标签: c++ c++11 serialization deserialization


【解决方案1】:

我建议使用 std::ostringstream。

#include <sstream>

template <typename T>
void myClassImpl(const T& data)
{
   std::ostringstream oss; 
   oss << data;
   sendData(oss.str());
}

注意:长度可以从 std::string 中获取

编辑: 如果您只希望它适用于特定类型,则可以重载 my myClass 函数并使用模板具有相同的实现。请参阅下面的示例。

void myClass(int data)
{
   myClassImpl(data);
}

注意:从 C++17 开始你也可以使用variants

【讨论】:

  • 该函数只适用于少数特定的数据类型,例如 int、字符数组或 int 数组、字符串。对于其他(不受支持的)类型,它应该返回错误。
  • 相应地编辑了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 2018-08-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多