我想手动创建一个(json)文件(用python),然后用cereal加载到我的c++应用程序中。
使用ceral保存和加载工作正常。但是,json文件中的polymorphic_ids对我来说不清楚。
这里有一个更清晰的例子:这是由谷物框架生成的对象:
{
"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++导入程序时,这些数字会发生变化?
1条答案
按热度按时间zaqlnxep1#
ptr_wrappers中的id由cereal生成,用于跟踪保存或加载时已序列化的指针。它们是32位无符号整数,从1开始,每保存一个新指针,id就递增一次。
如果是第一次遇到指针,则最高有效位被设置为1,以便cereal可以避免多次保存数据。如果数据已经保存,则cereal将查找先前生成的数字并使用该数字。请注意,此查找的数字不会将MSB设置为1。
有关详细信息,请参阅InputArchive和OutputArchive中的函数registerSharedPointer。
多态id以相同的方式使用它们自己的计数器生成,请参阅同一文件中的registerPolymorphicType函数。
一般来说,我不建议尝试手动生成处理多态或共享指针之类的事情的cereal JSON,因为错误地生成这些数字可能会导致程序崩溃。但是,如果您可以确保它们完全像cereal一样生成,它应该可以工作。