SAVE AND LOAD BINARY / XML

Лучший способ помочь другим, поделиться своими находками.

SAVE AND LOAD BINARY / XML

Сообщение Neodrop 24 окт 2009, 01:30

: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 без администраторских прав.
У вас нет доступа для просмотра вложений в этом сообщении.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: SAVE AND LOAD BINARY

Сообщение Neodrop 24 окт 2009, 03:12

1015 объектов.
Сохранение/загрузка мгновенны.
Размер файла SaveMe.neo = 107 килобайт.
У вас нет доступа для просмотра вложений в этом сообщении.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: SAVE AND LOAD BINARY

Сообщение Piatrouski 24 окт 2009, 06:32

Сорри, если флуд... но всё же - почему XML проклятый формат? Если скорость парсинга - то просто нужно включить мозг, если "типа" защита от вменяемого редактирования - то тоже решаемо.
Bla-bla
Аватара пользователя
Piatrouski
UNIт
 
Сообщения: 104
Зарегистрирован: 21 мар 2009, 19:44
Откуда: Minsk, Biełaruś
  • Сайт
  • ICQ

Re: SAVE AND LOAD BINARY

Сообщение Neodrop 24 окт 2009, 13:13

1. Размер. Это главное. Особенно для сети.
2. Скорость. Ничего ты тут не включишь нового.
3. Конечно же - открытость.
4. Видимо по скудости ума, все игры на свете, хранят сейвы в бинарниках. Или от того, что не посчастливилось ознакомиться со стандартом XML. :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: SAVE AND LOAD BINARY

Сообщение Neodrop 24 окт 2009, 13:56

Залит новый паккадж.
Добавлено :
[V] Проверка существования файла при попытке загрузки.
Исправлено :
[V] Дублирующиеся имена объектов, вызывавшие исключение при заполнении Hashtable.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: SAVE AND LOAD BINARY

Сообщение Piatrouski 24 окт 2009, 18:22

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 естественно не панацея от всего и прежде всего следует смотреть на размер данных, которые надо сохранить... Иногда это просто ссылка на уровень и объекты, которые изменили своё состояние, а иногда информация о тысячах объектах...
Bla-bla
Аватара пользователя
Piatrouski
UNIт
 
Сообщения: 104
Зарегистрирован: 21 мар 2009, 19:44
Откуда: Minsk, Biełaruś
  • Сайт
  • ICQ

Re: SAVE AND LOAD BINARY

Сообщение Neodrop 24 окт 2009, 18:45

Тысячу объектов хранить в XML самоубийство. Это точно.
Конечно, для некоторых целей, это вполне приемлемый вариант и, один их наших камрадов, грозился выложить тут систему хранения данных в XML. Пожуём - увидим.
Ясно, что для решения каждой конкретной задачи, лучше иметь подобающий подход.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: SAVE AND LOAD BINARY

Сообщение Mr_Anderson 25 дек 2009, 11:53

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

Ловите XML сохранялку :)
SaveAndLoadXML.unitypackage
У вас нет доступа для просмотра вложений в этом сообщении.
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: SAVE AND LOAD BINARY

Сообщение Neodrop 25 дек 2009, 12:42

Спасибо. Мне она в страшном сне не сдалась. Но кому то точно пригодиться.

С помошью своего класса (очень сильно переписанного) я сохраняю 5000 автомобилей в каждом кадре. Позицию и вращение. И воспроизвожу позже. Сколько это весило бы в XML даже думать не хочется. О скорости чтения, тоже не будем вспоминать.
Но для большинства простых задач, конечно XML отличный выбор.
С бинарниками есть ещё (решаемые) но проблемы в использовании, вызванные особенностями реализации MONO.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: SAVE AND LOAD BINARY

Сообщение Mr_Anderson 25 дек 2009, 13:20

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

Re: SAVE AND LOAD BINARY

Сообщение Neodrop 25 дек 2009, 14:26

Для БД точно так же подходят бинарники. Заодно размер базы меньше будет. Особенно, если их ещё и зипануть на лету.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: SAVE AND LOAD BINARY / XML

Сообщение Neodrop 25 дек 2009, 15:17

Подправил название темы. :ymparty:
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: SAVE AND LOAD BINARY / XML

Сообщение sp00n 02 мар 2010, 15:27

Спасибо огромное, Нео.
Я как раз подошел к моменту в проекте , когда надо задуматься, как сохранить/загрузить много обьектов сцены, а тут вот оно, уже на блюдечке.
Если будут предложения по функционалу - обязательно отпишусь, а, может, и сам добавлю и выложу сюда.
Еще раз мега респект.
Ты молод, креативен, талантлив?
Амбициозен, уверен в себе, полон свежих идей?
А делать хоть что-нибудь умеешь?!
sp00n
UNITрон
 
Сообщения: 254
Зарегистрирован: 27 фев 2010, 20:43

Re: SAVE AND LOAD BINARY / XML

Сообщение stneas 16 мар 2010, 13:39

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

Создаем отдельный класс
Синтаксис:
Используется 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/
stneas
UNец
 
Сообщения: 3
Зарегистрирован: 16 мар 2010, 13:09

Re: SAVE AND LOAD BINARY / XML

Сообщение Neodrop 16 мар 2010, 15:01

Хм, я пробовал, но что то не заработало. Оттуда же код брал.
Впрочем, мне проще упихать сохраняемый класс в dll и не париться.

P.S. Учимся использовать тег syntax
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

След.

Вернуться в Исходники (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3