如何手动创建谷物导入文件?

问题描述:

我想创建一个(json)文件manuyll(用python),然后将它加载到我的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++导入程序时这些更改会保存吗?

ptr_wrappers中的id由谷物生成,以便在保存或加载时跟踪它已经序列化的指针。它们是从1开始的32位无符号整数,并且对于每个保存的新指针增加。

如果遇到第一次指针时,最高有效位设置为1,这样谷物可以避免多次保存数据。如果数据已经保存,谷物会查找以前生成的数字并使用它。请注意,查找的号码不会将MSB设置为1.

有关更多信息,请参阅InputArchiveOutputArchive中的函数registerSharedPointer。

使用各自的计数器以相同的方式生成多态ids,请参阅同一文件中的registerPolymorphicType函数。

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