gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:56:32 25 4
gpt4 key购买 nike

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

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

提前致谢!

最佳答案

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

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

  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++ 的 ParserVar JSON 模型。一种选择是让所有实体 POCO 类实现 to_varfrom_var 函数,或者您可以将这些序列化函数保存在每个 POCO 类的不同命名空间中,以便您只需要在必要时包含它们。

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

关于c++ - POCO C++ 对象到 JSON 字符串序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52437428/

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