如何手动创建用于谷物导入的文件

how to create manually a file for cereal import?

本文关键字:导入 文件 何手动 创建 用于      更新时间:2023-10-16

我想手动创建一个(json)文件(使用python)并将其加载到我的c++应用程序中。

保存和加载使用谷物工作良好。但是,json文件中的多态性对我来说并不清楚。

下面是一个更清晰的例子:这是由谷物框架生成的对象:
{
    "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,这样可以避免多次保存数据。如果数据已经保存,那么麦片将查找以前生成的数字并使用它。请注意,这个查询的数字不会将MSB设置为1。

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

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

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