К основному контенту

Unity XML vs JSON

Довольно долгое время я пользовался XML для сохранения уровней. Но в новой игре я стал подмечать что данных которые нужно сохранять все больше и размер одного файла становиться все толще.
Решил попробовать 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);
}

Комментарии