Buffer icon Проекты

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); // обратно из строки в объект
Поделиться
Отправить
Отправить
 523   2017   unity   разработка   с#
4 комментария
Leopotam 2017
  1. Xml — толстый формат по объему.
  2. Xml сериализатор — один из самых медленных.
  3. Работа с Xml требует принудительного включения полного набора FW2.0 вместо порезанного subset.
    Почему не json? По объему меньше, работает быстрее, с 5.х есть штатная реализация.
Игорь Лопатин 2017

Использовал только для сохранения каких-то настроек в PlayerPrefs, поэтому скорость была не особо критична.

Leopotam 2017

Так как не критична — это же синхронное сохранение настроек в рантайме с блокировкой потока :) Еще у PlayerPrefs есть лимит на размер — в браузерах вроде 1-2Мб, на мобилках хз. Под windows это вообще реестр.

Игорь Лопатин 2017

^_^
А JsonUtility не блокирует поток?

Leopotam 2017

Блокирует, но он реализован в нейтиве, а это несоизмеримо быстрее + размер данных меньше (меньше генерировать / писать / считывать / парсить). Ну и автомапинг на типы решает :)
А вообще, можно делать вот такие штуки: https://github.com/Leopotam/LeopotamGroupLibraryUnity.Examples/blob/master/Assets/LeopotamGroup.Examples/Serialization/SerializationTest.cs
JsonUtility так не умеет ;)

Игорь Лопатин 2017

О_О это я как-то пропустил... :) Спасибо

Leopotam 2017

Аналогичный тест будет примерно таким:
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)

Можно сравнить размер выхлопа :)

Популярное