У меня есть программа, которая использует инфраструктуру системы сущностей. По сути, это означает, что у меня есть набор объектов, к которым прикреплены различные компоненты. Объекты на самом деле являются целыми идентификационными номерами, а к ним привязаны компоненты, сопоставляя компонент с указанным идентификационным номером объекта.C++, ECS и сохранение/загрузка
Теперь мне нужно сохранить коллекции объектов и связанных компонентов в файл, который может быть изменен позже, поэтому в основном мне нужны функции сохранения и загрузки. Однако, будучи новичком на C++, мне трудно понять, как это сделать.
Исходя из Java и C#, моим первым выбором было бы сериализовать объекты, скажем, в JSON, а затем десериализовать их при загрузке JSON. Однако C++ не имеет никаких функций отражения. Итак, возникает вопрос: как мне сохранить и загрузить объекты C++? Я не имею в виду фактические операции с файлами, я имею в виду способ, которым должны обрабатываться объекты и структуры, чтобы сохранить их между запусками программ.
Существует много библиотек сериализации, если вы просто немного выглядите. Поскольку, как вы отметили, C++ не имеет отражения, ни одна из библиотек не работает без вашей помощи, часто в форме написания функции, которая выполняет фактическую сериализацию/десериализацию данных каждой сериализуемой структуры (например, пуская вы пишете элементы в поток, точно так же, как написание, например, 'std :: cout'). –
@JoachimPileborg Я нашел некоторые библиотеки, когда искал. Дело в том, что я не знаю, как построить правильный объект на основе сериализованных данных. Предположим, что есть компонент 'FooComponent' и еще один, называемый' BarComponent' - как узнать, какой из них построить без данных отражения? – manabreak
Это зависит от используемой библиотеки. Некоторые позволяют вам регистрировать заводские функции вместе с идентификатором, а сериализатор помещает идентификатор в поток для чтения десериализатора, чтобы он мог вызывать правильную заводскую функцию. Другие библиотеки обрабатывают его самостоятельно, а это значит, что вы должны сами отслеживать это (возможно, через сопоставление идентификаторов и фабричных функций). –