Страница 1 из 5

SAVE AND LOAD BINARY / XML

СообщениеДобавлено: 24 окт 2009, 01:30
Neodrop
:ymparty: Я опять произвёл революцию в [unity 3D] Unity творчестве. (говорит, скромно потупив глаза)
По широте своей души, делюсь, друзья, с вами.

Итак.
SaveAndLoad.unitypackage
(перезалита новая версия.)
Тут лежит паккадж, содержащий в себе малюсенький класс, который не просто изменит подход к сохранению из [unity 3D] Unity но и позволит реализовать Сохранение и Загрузку из [unity 3D] Unity в бинарный файл, а не в проклятый XML
Класс BinarySaver не манна небесная. Большинство типов в [unity 3D] Unity прямо сериализовать невозможно, потому нужно писать сериализуемый класс - рефлектор, отражающий в себе в упрощённом виде то, что вы хотите сохранить.
Приложенная сцена показывает как нужно работать с бинарным сохранением и как писать классы-рефлекторы.
В сцене мы увидим :

[V] Сохранение типа созданных примитивов.
[V] Сохранение их позиции.
[V] Сохранение имени объектов.
[V] Сохранение настроек скрипта, висящего на них.
[V] Сохранение цвета объектов.
[V] Возможность записи новых объектов после загрузки старых. Так сказать "дозаписи". *(Хотя это просто прямая перезапись файла).

Сохранённый файл, при запуске из Редактора, будет записан в папку Проекта, выше папки Assets.

Я буду признателен за :

[V] Помощь в проверке на Маке. ( [V] Проверил сам. Всё отлично работает.)
[V] Толковые советы по улучшению функционала.
[V] Дельные коды, которыми вы пожелаете поделиться с сообществом.
[V] Нужна проверка работоспособности кода при условии, что программа запущена в сессии Windows без администраторских прав.

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 24 окт 2009, 03:12
Neodrop
1015 объектов.
Сохранение/загрузка мгновенны.
Размер файла SaveMe.neo = 107 килобайт.

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 24 окт 2009, 06:32
Piatrouski
Сорри, если флуд... но всё же - почему XML проклятый формат? Если скорость парсинга - то просто нужно включить мозг, если "типа" защита от вменяемого редактирования - то тоже решаемо.

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 24 окт 2009, 13:13
Neodrop
1. Размер. Это главное. Особенно для сети.
2. Скорость. Ничего ты тут не включишь нового.
3. Конечно же - открытость.
4. Видимо по скудости ума, все игры на свете, хранят сейвы в бинарниках. Или от того, что не посчастливилось ознакомиться со стандартом XML. :-?

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 24 окт 2009, 13:56
Neodrop
Залит новый паккадж.
Добавлено :
[V] Проверка существования файла при попытке загрузки.
Исправлено :
[V] Дублирующиеся имена объектов, вызывавшие исключение при заполнении Hashtable.

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 24 окт 2009, 18:22
Piatrouski
Neodrop писал(а):1. Размер. Это главное. Особенно для сети.
2. Скорость. Ничего ты тут не включишь нового.
3. Конечно же - открытость.
4. Видимо по скудости ума, все игры на свете, хранят сейвы в бинарниках. Или от того, что не посчастливилось ознакомиться со стандартом XML. :-?


1. Юнити НЕ пакует данные при создании webalone?! 8()
2. Я использую библиотеку libxml в своём проекте (пишу к сожалению не на Unity), скоростью доволен.
3. Но ведь есть и binary XML...
Age of Mythology used a huge number of XML files for tons of stuff, including gamedata. In the final release they were compiled into XMB files, which a simply a commpressed binary representation of the XML file. I don't know the specific's on how this all worked, but anone intrested might take a look around the AOM community as there seems to be an XMB->XML converter out.

4. XML естественно не панацея от всего и прежде всего следует смотреть на размер данных, которые надо сохранить... Иногда это просто ссылка на уровень и объекты, которые изменили своё состояние, а иногда информация о тысячах объектах...

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 24 окт 2009, 18:45
Neodrop
Тысячу объектов хранить в XML самоубийство. Это точно.
Конечно, для некоторых целей, это вполне приемлемый вариант и, один их наших камрадов, грозился выложить тут систему хранения данных в XML. Пожуём - увидим.
Ясно, что для решения каждой конкретной задачи, лучше иметь подобающий подход.

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 25 дек 2009, 11:53
Mr_Anderson
Добрались руки до Вашего примера, Нео. Теперь работает только XML. Я слегка отрефакторил Ваш код ;)
Hashtable заменил на List<>, так проще и без напрягов с проверками ключей.
Класс, содержащий данные для сохранения упрощен, т.к. Vector3 и Color сериализуются в XML, но к сожалению для бинарного требуют шаманства :(

Ловите XML сохранялку :)
SaveAndLoadXML.unitypackage

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 25 дек 2009, 12:42
Neodrop
Спасибо. Мне она в страшном сне не сдалась. Но кому то точно пригодиться.

С помошью своего класса (очень сильно переписанного) я сохраняю 5000 автомобилей в каждом кадре. Позицию и вращение. И воспроизвожу позже. Сколько это весило бы в XML даже думать не хочется. О скорости чтения, тоже не будем вспоминать.
Но для большинства простых задач, конечно XML отличный выбор.
С бинарниками есть ещё (решаемые) но проблемы в использовании, вызванные особенностями реализации MONO.

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 25 дек 2009, 13:20
Mr_Anderson
XML - это тема для БД например, + еще править (создавать) xml в текстовом редакторе чтоб потом свойства объектов поменять и все такое... Ну где объемы большие и связи с внешними приложениями не нужны, то бинарники однозначно рулят.
P.S. Предлагаю добавить в название темы XML, возможно людям пригодится ;)

Re: SAVE AND LOAD BINARY

СообщениеДобавлено: 25 дек 2009, 14:26
Neodrop
Для БД точно так же подходят бинарники. Заодно размер базы меньше будет. Особенно, если их ещё и зипануть на лету.

Re: SAVE AND LOAD BINARY / XML

СообщениеДобавлено: 25 дек 2009, 15:17
Neodrop
Подправил название темы. :ymparty:

Re: SAVE AND LOAD BINARY / XML

СообщениеДобавлено: 02 мар 2010, 15:27
sp00n
Спасибо огромное, Нео.
Я как раз подошел к моменту в проекте , когда надо задуматься, как сохранить/загрузить много обьектов сцены, а тут вот оно, уже на блюдечке.
Если будут предложения по функционалу - обязательно отпишусь, а, может, и сам добавлю и выложу сюда.
Еще раз мега респект.

Re: SAVE AND LOAD BINARY / XML

СообщениеДобавлено: 16 мар 2010, 13:39
stneas
В моем проекте я попробовал прикрутить сохранялку в бинарный файл, однако столкнулся с неприятной особенностью юнити менять версию сборки
при перекомпиляции скриптов, на практике это выливается в то что бинарник от старой версии в новой загрузить невозможно.
Для приложения которое само сохраняет и загружает файл это конечно не критично, однако у меня написан отдельный редактор для вещей которые игрок хранит в инвентаре и каждый раз перебивать всю эту базу, при малейшем изменении в коде, нет никакого желания.
Может конечно уже все знают что с этим делать, но поиск по форуму ничего не дал, так что вот решение что бы новичкам обойти эти грабли :)

Создаем отдельный класс
Синтаксис:
Используется csharp
using System;
using System.Reflection;
using System.Runtime.Serialization;

public sealed class AllowAllVersionDeserializationBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        if (!string.IsNullOrEmpty(assemblyName) && !string.IsNullOrEmpty(typeName))
        {
            Type typeToDeserialize = null;

            //In this case we are always using the current assembly
            assemblyName = Assembly.GetExecutingAssembly().FullName;

            // Get the type using the typeName and assemblyName
            typeToDeserialize = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));

            return typeToDeserialize;
        }

        return null;
    }
}
 


после чего дописываем в методе Load в BinarySaver:
BinaryFormatter formatter = new BinaryFormatter();
formatter.Binder = new AllowAllVersionDeserializationBinder();

все, теперь бинарник будет загружаться не зависимо от версии сборки
решение взято отсюда http://spazzarama.wordpress.com/2009/06/25/binary-deserialize-unable-to-find-assembly/

Re: SAVE AND LOAD BINARY / XML

СообщениеДобавлено: 16 мар 2010, 15:01
Neodrop
Хм, я пробовал, но что то не заработало. Оттуда же код брал.
Впрочем, мне проще упихать сохраняемый класс в dll и не париться.

P.S. Учимся использовать тег syntax