Войти
ПроектыФорумРелизы

DirectConvertor - прямые конвертации альтернатива сериализации [сохранение ваших игр]

Advanced: Тема повышенной сложности или важная.

#0
(Правка: 21:27) 21:19, 10 мар. 2021

Прямые конвертации являются альтернативой сериализации. Используются два
формата:

• текстовый, как наиболее репрезентативный, конвертирующий поля классов в
текст и разделяющий поля отступами (\t) и переносом строки (\n)

• бинарный, как наиболее экономный, конвертирующий поля классов в
последовательность байтов.

При этом может использоваться запись сразу в файл или получение дампа для
последующей записи или передачи по сети.

Многие подходы для управления сериализацией используют атрибуты классов и
рефлексию (reflection), что создает многие неудобства и замедляет процесс. Прямые
конвертации вместо этого используют ряд разработанных классов и интерфейсов,
которые позволяют гибко настраивать какие поля будут конвертироваться в единый
файл/дамп данных.

В данной версии поддерживаются конвертация, часто используемых полей:

• Примитивных типов: string, int, float, bool

• Специфичных типов: Guid, Vector3, Transform

• Иерархическое включение (агрегация) объектов, в том числе компонент
юнити (префабы)

• Обобщенные списки List<> как с примитивным типом, так и объектом (в том
числе вложенным списком или словарем)

• Словари Dictionary<,> с ключом string или int, и значением примитивного типа,
объекта (в том числе вложенные списки или словари)

При необходимости новые типы добавляются сравнительно просто.


Доступно на Asset Store

+по ссылке подробная документация с примерами кода


#1
14:25, 13 мая 2021
Ну что ж, продолжаем разговор ..

Мой "официальный друг" написал статью, объясняющую чем данный подход лучше ...

Почему для сохранения игр использование сериализации плохая идея?

При наличии интереса попробую разжевать подробности ...

#2
14:32, 13 мая 2021

tac
не боишься бана?

>При наличии интереса попробую разжевать подробности ...
давай, но я для себя уже выбор сделал, делать всё ручками)

#3
(Правка: 14:45) 14:37, 13 мая 2021

u960
> не боишься бана?
остается надеется на адекватность, и не вступать в разговор с не конструктивными людьми :) 

u960
> я для себя уже выбор сделал, делать всё ручками
какие причины? на самом деле это правильно, если проект не большой .. иначе хочется так или иначе сделать удобный фреймфорк. Мой позволяет достаточно легко управлять разработкой.

Сделаю даже акцию, как тут говорят невиданной щедрости.

Все кто интересуются, готов примерить мой фреймфорк под ваш конкретный пример - игру, прототип. Но только без умозрений, а вы даете в той или иной мере законченный код на Юнити, и говорите что хочется сохранять. Я пробую это реализовать.

#4
(Правка: 6:44) 6:34, 14 мая 2021

В документации есть такой тезис:

Следить за рекурсией вложенных объектов не является задачей прямых
конвертаций. Но её можно легко избежать, например, для графа храня отдельно
уникальные узлы и отдельно переходы между ними. [и показывается как это сделать]

Но в более сложных ситуациях, когда это нужно делать чаще, хочется не очень задумываться как сохранились ссылки на объекты. Точнее при восстановлении мы хотим, чтобы одинаковые объекты оставались одним и тем же объектом (а не их копиями). А при сохранении информация о них не дублировалась бы в файле.

Условно бесплатная версия "прямых конвертаций" действительно не позволяла хранить ссылки, а значит и null объекта. [Это на самом деле не такое большое ограничение для небольших проектов. Достаточно при сохранении вместо этого создать пустой объект. И как показано в документации, по своим правилам, зная, где исходные объекты, восстановить их копии].

Расширенная версия это позволяет делать по определенной логике. (на самом деле, задача рекурсивных ссылок при используемом подходе реализации не существует вовсе, она бессмысленная, но это надо пояснять). Но при этом она в отличии от сериализации не загоняет нас в узкие рамки.

Но чтобы пояснить последующие моменты предлагаю решить одну программную задачку, полезную для тренировки мозга :)

Как определить тип переменной, если она имеет значение null ?

Например,

        
        public Type Get(object argObject)
        {
            return argObject.GetType();
        }

будет полезен всегда, пока значение не будет =null. Как изменить метод, чтобы тип и в этом случае был бы возвращен методом? (при этом вид вызова не поменялся бы)

Вот и посмотрим на знания местных гуру

#5
1:54, 5 ноя. 2021

up

#6
4:05, 5 ноя. 2021

вот тебя переклинило, сериализация это меньше одного процента кода игры, лучше бы игру сделал
кто-нибудь купился на ассет?

#7
(Правка: 12:15) 11:55, 5 ноя. 2021

#!
> сериализация это меньше одного процента кода игры
в том то и дело, что не сериализация, а простая запись в файл :)

а так да, подгорело тогда немного, когда всякие умники занимаются оверхедом с сериализацией ... но не жалею, сделал стабильное и простое решение, которое уже использую много где
ПроектыФорумРелизы