Каков наилучший способ сохранения / загрузки игровых данных в обновленном графе объектов? - PullRequest
0 голосов
/ 13 мая 2019

Мне нужны советы и рекомендации по обработке сериализации / десериализации объектов для использования в игре ARPG, которую я хочу написать на каком-то этапе. В частности, этот вопрос касается сохранения данных и повторной загрузки этих данных с правильной информацией. Это не зависит от игрового движка.

Сценарий: у меня есть класс, который представляет игрока (Player). В этом классе есть свойство, в котором хранится класс ролевой игры персонажа (CharacterClass). Класс CharacterClass описывает имя и некоторые минимальные и максимальные значения для символьных атрибутов.

public class Player
{
       public string Name { get; set; }

       public long Experience { get; set; }

       public CharacterClass CharacterClass { get; set; }

       ...
}

public class CharacterClass
{
       public string Name { get; set; }

       public MinMaxValue Strength { get; set; }

       public MinMaxValue Dexterity { get; set; }

       ...
}

Когда я сохраняю эту информацию с помощью сериализации XML или JSON, я сохраняю граф / состояние объекта в том виде, в котором он был в данный момент. Затем я могу загрузить его при запуске игры, чтобы восстановить часть сохраненной игры игрока.

{  
   "Name":"Arthur",
   "Experience":0,
   "CharacterClass":{  
      "Name":"Mage",
      "Strength":{  
         "Min":10,
         "Max":80
      },
      "Dexterity":{  
         "Min":15,
         "Max":90
      }
   }
}

Проблема: что если свойства в CharacterClass изменятся? Предположим, изменилось имя или изменились значения атрибута класса персонажа. Данные для класса CharacterClass будут загружаться из файла при запуске игры отдельно, но отсоединенные данные из файла сохраненной игры игрока больше не содержат актуальную версию объекта.

Эта же концепция применима ко многим "игровым объектам", которые имеют связанные классы в качестве свойств. Другой пример может включать оборудование игрока с аффиксами, суффиксами, редкостью и т. Д. Каждый из них является либо классом, либо списком классов. Если все эти значения сериализованы, они могут не представлять текущие данные, хранящиеся в хранилище основных данных, отдельно от данных игры сохранения игрока.

Другая проблема, связанная с дисконтированием состояния данных, - это размер. Сериализация всех связанных объектов в сохраненном родительском объекте, вероятно, займет много места.

Потенциальное решение: я мог бы пометить свойство CharacterClass внутри класса Player как проигнорированное, чтобы оно не сериализовалось, и добавить строку идентификатора ссылки на класс CharacterClass, который помещается в класс Player, следующим образом:

public string CharacterClassId { get; set; }

[IgnoreDataMember]
public CharacterClass CharacterClass { get; set; }

Во время инициализации объекта я мог найти справочную строку в хранилище CharacterClass (например, в списке памяти) и повторно подключить объект к объекту Player. Это будет актуальная версия объекта. Результирующий JSON будет выглядеть так:

{  
   "Name":"Arthur",
   "Experience":0,
   "CharacterClassId":"MageClass001"
}

Меня беспокоит это решение - объем ручной работы, необходимый для повторного подключения отключенных объектов во время инициализации.

Вопросы:

  1. Является ли это решение жизнеспособным?
  2. Есть ли лучший способ сделать это?
  3. Кто-нибудь знает, как это обрабатывается как отраслевой стандарт, и могут ли они указать мне какую-либо соответствующую документацию?
...