Cериализация в XML и обратно
Обновлено 17.04.17
Продвинутая версия сериализации в XML, работает в несколько раз быстрее штатной
Как преобразовать объект в строку, например для сохранения или передачи, а потом обратно? Есть две простые функции, которые я использовал в одном из Unity проектов:
public static object Deserialize<T> (string toDeserialize) {
XmlSerializer xmlSerializer = new XmlSerializer (typeof (T));
StringReader textReader = new StringReader (toDeserialize);
return xmlSerializer.Deserialize (textReader);
}
public static string Serialize<T> (T toSerialize) {
XmlSerializer xmlSerializer = new XmlSerializer (typeof (T));
StringWriter textWriter = new StringWriter ();
xmlSerializer.Serialize (textWriter, toSerialize);
return textWriter.ToString ();
}
Использовать очень просто:
Vectror3 vector = new Vector3 (10f, 10f, 10f); // какой-то объект
string data = Serialize<Vector3> (vector); // преобразовываем в строку
vector = (Vector3) Deserialize<Vector3> (data); // обратно из строки в объект
Почему не json? По объему меньше, работает быстрее, с 5.х есть штатная реализация.
Использовал только для сохранения каких-то настроек в PlayerPrefs, поэтому скорость была не особо критична.
Так как не критична — это же синхронное сохранение настроек в рантайме с блокировкой потока :) Еще у PlayerPrefs есть лимит на размер — в браузерах вроде 1-2Мб, на мобилках хз. Под windows это вообще реестр.
^_^
А JsonUtility не блокирует поток?
Блокирует, но он реализован в нейтиве, а это несоизмеримо быстрее + размер данных меньше (меньше генерировать / писать / считывать / парсить). Ну и автомапинг на типы решает :)
А вообще, можно делать вот такие штуки: https://github.com/Leopotam/LeopotamGroupLibraryUnity.Examples/blob/master/Assets/LeopotamGroup.Examples/Serialization/SerializationTest.cs
JsonUtility так не умеет ;)
О_О это я как-то пропустил... :) Спасибо
Аналогичный тест будет примерно таким:
var vector = new Vector3 (10f, 10f, 10f);
var data = Singleton.Get<JsonSerialization> ().Serialize (vector);
var vector2 = Singleton.Get<JsonSerialization> ().Deserialize<Vector3> (data);
Debug.Log (vector);
Debug.Log (data);
Debug.Log (vector2);
На выходе:
(10.0, 10.0, 10.0)
{«x»:10,«y»:10,«z»:10}
(10.0, 10.0, 10.0)
Можно сравнить размер выхлопа :)