【问题标题】:C++ how to implement settings of different types that are serializable/deserializableC++如何实现可序列化/反序列化的不同类型的设置
【发布时间】:2022-12-21 22:48:29
【问题描述】:

我正在尝试实现一个系统,其中我有一个实现 Serializable 接口的模板类。

现在,接口包含序列化/反序列化方法,而模板设置类有 get/set,私有成员 settingName、settingValue 和模板函数 T adaptType() 使用 >> 运算符使字符串适应正确的类型(https://gist.github.com/mark-d-holmberg/862733) .该文件还包含一个自定义结构,其中重载了 << 和 >> 运算符以使一切正常。

在结构的情况下,设置以 settingName:settingValue 或 settingName:val1;val2;val3 的形式序列化。

这个设计有两个问题:

  1. 我想将所有这些设置对象保存在一个 map<string, ISerializable*(?)> 中以访问它们,但是我无法在这些对象上调用其他函数 get/set,因为接口没有定义方法(它们必须在设置类中,因为它们的类型取决于模板类型),如果我将映射中的第二种类型切换到模板类,我必须定义一个具体类型
  2. 反序列化时,无法知道它是哪种类型,并且 ISerializable 无法实例化,因为它是一个抽象类,我再次需要知道我正在反序列化哪种类型,并用适当的类型实例化 Setting 类

    有没有更好的方法来设计这个或我缺少的东西,请注意我不是很精通 c++

    问题的背景: 我在一个嵌入式设备上工作,需要将设置加载/保存到闪存,但设备上还有另一个框架在运行,它将这些设置保存在 RAM 中,并在要编辑的网络服务器上提供它们,我无法更改这部分。我的目标是将这些设置手动保存到我的自定义类中,该类管理设置并保存/加载到闪存,以便它在重新启动之间保持不变并与 Web 框架同步。

    欢迎任何帮助或建议

【问题讨论】:

  • 如果您可以分享一个玩具示例界面以及您将在何处脱困......但是根据您的描述我怀疑对于问题 1 您可能会发现“双重派遣”方法会起作用。对于问题 2,您可能会尝试使用工厂模式,因此当您序列化时,您存储了一些类型的表示,然后在反序列化时,您将该字符串/枚举/等值传递给工厂,它会为您创建具体类型

标签: c++ serialization deserialization


【解决方案1】:

据我了解你的问题,它类似于 Oops 库正在做的事情。它为具有相似功能的所有类型创建一个类型描述符类:给出类型的一些描述并为它们提供文本和二进制序列化。它还旨在处理配置,因此它甚至可能有助于解决您的问题。 至少为了获得一些想法值得一看:https://bitbucket.org/barczpe/oops

【讨论】:

    猜你喜欢
    • 2013-09-28
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多