Я хотел бы создать (json) файл manuyll (с python) и затем загрузить его с помощью cereal в мое приложение на c ++.
Сохранение и загрузка с использованием ceral работает нормально. Однако polymorphic_ids в файле 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...
}
}
}
}
]
}
« `
Поскольку я наблюдаю генерацию номера, самый первый идентификатор увеличивается. Второй массив использует первый идентификатор в качестве своего полиморфного идентификатора и дополнительно увеличивает числа.
Так есть ли логика, почему эти цифры были использованы?
Можно ли просто использовать их все время или они изменятся, когда я запустлю свой импортер c ++ на другой машине?
Идентификаторы в ptr_wrappers генерируются зерновыми для отслеживания указателей, которые уже сериализованы при сохранении или загрузке. Это 32-разрядные целые числа без знака, которые начинаются с 1 и увеличиваются при каждом сохранении нового указателя.
Наиболее значимый бит устанавливается в 1, если указатель встречается впервые, поэтому зерновые могут избежать сохранения данных более одного раза. Если данные уже были сохранены, зерновые будут искать ранее сгенерированный номер и использовать его вместо этого. Обратите внимание, что для этого искомого номера MSB не будет установлен в 1.
Смотрите функции registerSharedPointer в InputArchive а также OutputArchive для дополнительной информации.
Полиморфные идентификаторы генерируются идентичным образом с использованием их собственного счетчика, см. Функции registerPolymorphicType в том же файле.
В общем, я бы не рекомендовал пытаться вручную генерировать JSON для злаков, который имеет дело с такими вещами, как полиморфизм или общие указатели, поскольку неправильная генерация этих чисел может привести к сбою в вашей программе. Однако, если вы можете гарантировать, что они генерируются именно так, как хлопья, это должно сработать.