gpt4 book ai didi

c++ - 如何手动创建 Cereal 进口文件?

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

我想创建一个 (json) 文件 manuyll(使用 python),然后将其与 Cereal 一起加载到我的 C++ 应用程序中。

使用 ceral 保存和加载工作正常。但是,json 文件中的 polymorphic_ids 我不清楚。

这里有一个更清楚的例子:这是由 Cereal 框架生成的对象:```

{
"array1": [
{
"key": 0,
"value": {
"ptr_wrapper": {
"id": 2147483649, //!-- ID1
"data": {
...some float fields...
}
}
}
},
{
"key": 1,
"value": {
"ptr_wrapper": {
"id": 2147483650, //!-- This is previous ID+1 and so on...
"data": {
... some float fields...
}
}
}
}
],
"array2": [
{
"key": 0,
"value": {
"polymorphic_id": 2147483649, //!-- this is the very first ID from array 1.
"polymorphic_name": "my_struct_name",
"ptr_wrapper": {
"id": 2147483651, //this ID1+N Elements from array1
"data": {
... also some float stuff...
}
}
}
}
]
}

```

当我观察数字生成时,第一个 ID 增加了。第二个数组使用第一个 ID 作为其多态 ID,并进一步增加数字。

那么为什么使用这些数字有一些逻辑吗?一直使用它们是省事还是当我在另一台机器上运行我的 c++ 导入器时这些会改变?

最佳答案

ptr_wrappers 中的 id 由 cereal 生成,用于跟踪它在保存或加载时已经序列化的指针。它们是 32 位无符号整数,从 1 开始,并随着每个新指针的保存而递增。

如果是第一次遇到指针,则最高位设置为 1,这样 cereal 就可以避免多次保存数据。如果数据已经保存,则 cereal 将查找之前生成的数字并使用它来代替。请注意,这个查找的数字不会将 MSB 设置为 1。

请参阅 InputArchive 中的函数 registerSharedPointer|和 OutputArchive了解更多信息。

多态 ID 是使用它们自己的计数器以相同的方式生成的,请参阅同一文件中的 registerPolymorphicType 函数。

一般来说,我不建议尝试手动生成处理多态性或共享指针等问题的 Cereal JSON,因为错误地生成这些数字可能会使您的程序崩溃。但是,如果您可以确保它们的生成与 Cereal 完全一样,那么它应该会起作用。

关于c++ - 如何手动创建 Cereal 进口文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31669896/

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