Довольно долгое время я пользовался XML для сохранения уровней. Но в новой игре я стал подмечать что данных которые нужно сохранять все больше и размер одного файла становиться все толще.
Решил попробовать JSON. Я стараюсь не использовать сторонние плагины - лучше бесплатные или свои наработки. Поэтому взгляд упал на MiniJSON. Да и prime31 и NGUI использовали эту наработку.
Сериализация в профайлере XML:
Сериализация в профайлере JSON:
Меня интересовала именно сборка мусора ~250K(у XML) против ~60K(у JSON).
Размер файла уменьшился с 40K (XML) до 4K(JSON).
Теперь о минусах MiniJSON умеет работать только с перечислениями Dictionary, List.
Если у вас сложный класс со списками массивами классов. То приведется ручками переводить их из / в Dictionary<string, object>. И забыть о float и тд или парсить переводя предварительно в string.
Итого дописывать предварительные методы до сериализации и десериализации.
Привести проще:
А вот вывести:
Решил попробовать JSON. Я стараюсь не использовать сторонние плагины - лучше бесплатные или свои наработки. Поэтому взгляд упал на MiniJSON. Да и prime31 и NGUI использовали эту наработку.
Сериализация в профайлере XML:
Сериализация в профайлере JSON:
Меня интересовала именно сборка мусора ~250K(у XML) против ~60K(у JSON).
Размер файла уменьшился с 40K (XML) до 4K(JSON).
Теперь о минусах MiniJSON умеет работать только с перечислениями Dictionary, List.
Если у вас сложный класс со списками массивами классов. То приведется ручками переводить их из / в Dictionary<string, object>. И забыть о float и тд или парсить переводя предварительно в string.
Итого дописывать предварительные методы до сериализации и десериализации.
Привести проще:
result = new Dictionary<string,object>(); int i, j; int count = level.lands.Count; int[] landX = new int[count]; int[] landZ = new int[count]; int[] landID = new int[count]; int[] landTop = new int[count]; int[][] landNeighbors = new int[count][]; for (i = 0; i < count; ++i) { landX[i] = level.lands[i].x; landZ[i] = level.lands[i].z; landID[i] = level.lands[i].id; landTop[i] = level.lands[i].top; landNeighbors[i] = level.lands[i].neighbors.ToArray(); } ... result.Add(_landx, landX); result.Add(_landz, landZ); result.Add(_landid, landID); result.Add(_landtop, landTop); result.Add(_landneighbors, landNeighbors); ...
А вот вывести:
result = new OneLevelData(); List<object> landX = (List<object>)data[_landx]; List<object> landZ = (List<object>)data[_landz]; List<object> landID = (List<object>)data[_landid]; List<object> landTop = (List<object>)data[_landtop]; List<object> landNeighbors = (List<object>)data[_landneighbors]; List<object> list; result.lands = new List<Land>(); count = landID.Count; for (i = 0; i < count; ++i) { Land land = new Land(); land.x = Convert.ToInt32(landX[i]); land.z = Convert.ToInt32(landZ[i]); land.id = Convert.ToInt32(landID[i]); land.top = Convert.ToInt32(landTop[i]); list = (List<object>)landNeighbors[i]; land.neighbors = new List<int>(); for (j = 0; j < list.Count; ++j) { land.neighbors.Add(Convert.ToInt32(list[j])); } result.lands.Add(land); }
Комментарии
Отправить комментарий