POCO C++对象到 JSON 字符串序列化

POCO C++ object to JSON string serialization

本文关键字:字符串 序列化 JSON C++ 对象 POCO      更新时间:2023-10-16

我想知道如何使用 POCO C++库将给定类的对象(例如 Person(及其属性(例如名称、年龄(序列化为 JSON 字符串。

也许我应该使用 Poco::Dynamic 和 Poco::D ynamic::Var 来创建我的模型,以便使用 POCO::JSON::Stringifier?我无法想象如何做到这一点...

提前感谢!

与 Java 或 C# 不同,C++ 在运行时类型信息 (RTTI( 之外没有内省/反射功能,RTTI 具有不同的焦点并且仅限于多态对象。这意味着在非标准的预编译器之外,你必须以一种或另一种方式告诉序列化框架你的对象是如何结构的,以及你最终希望如何将其映射到intstd::string和其他基本数据类型的层次结构。我通常区分三种不同的方法来做到这一点:预编译器、内联规范、属性转换。

预编译器
  1. :预编译器方法的一个很好的例子是Google Protocol Buffers:https://developers.google.com/protocol-buffers/docs/cpptutorial。您可以在单独的.proto文件中定义实体,该文件使用专有编译器进行转换,以.c.h实体类。这些类可以像常规 POCO 实体一样使用,并且可以使用协议缓冲区进行序列化。

  2. 内联规范:Boost 序列化 (https://www.boost.org/doc/libs/1_67_0/libs/serialization/doc/index.html(、s11n (www.s11n.net( 和 restc-cpp (https://github.com/jgaa/restc-cpp( 是在您自己的代码中为框架显式指定 POCO 结构的示例。这样做的 API 可能或多或少复杂,但其背后的原则始终相同:您为类提供框架serialise/deserialise实现,或者注册元数据信息,允许框架生成它们。下面的例子来自restc-cpp:

struct Post {
int userId = 0;
int id = 0;
string title;
string body;
};
BOOST_FUSION_ADAPT_STRUCT(
Post,
(int, userId)
(int, id)
(string, title)
(string, body)
)
  1. 属性转换:我不想错过的最后一种序列化是显式转换为框架提供的中间数据类型。Boost 属性树 (https://www.boost.org/doc/libs/1_67_0/doc/html/property_tree.html( 和 JsonCpp (http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html( 是这种方法的很好的例子。你负责实现从你自己的类型到ptree的转换,Boost可以序列化到你喜欢的任何格式(XML,JSON(。

在C++中拥有所有三种方法的经验后,我建议将选项 3 作为您的默认设置。它似乎很好地映射到 POCO C++ 的Parser和 JSONVar模型。一种选择是让所有实体 POCO 类实现to_varfrom_var函数,或者可以将这些序列化函数保留在每个 POCO 类的不同命名空间中,以便仅在必要时包含它们。

如果您正在处理具有大量要序列化的对象的项目(例如通信库中的消息(,则预编译器选项可能值得进行初始设置工作和额外的构建复杂性,但这始终取决于您正在处理的特定项目。