Сериализация данных

Программирование на Юнити.

Сериализация данных

Сообщение StupidMoth 23 ноя 2019, 19:28

Здравствуйте. Я новичок как в unity3d, так и в C#, поэтому заранее прошу прощение, если спрашиваю что-то слишком очевидное.
Решил попробовать разобраться с системой сохранений в unity. Для хранения данных выбрал воспользоваться сохранением в файлы в виде бинарного кода (с помощью BinaryFormatter()). Начал искать примеры реализации подобного в сети. В связи с этим у меня накопилось несколько вопросов:
1. Директива (?) [SerializeField] нужна для обеспечения возможности сериализации приватных полей класса (при этом поля с типом доступа public сразу доступны для сериализации), а [System.Serializable] для того, чтобы мы могли сериализовать экземпляры целого класса (в т.ч. с его приватными полями). Верно ли я понимаю этот момент? И если нет, то в чем ошибаюсь?
2. Можем ли мы как-то сериализовать сразу несколько полей/экземпляров класса и записать их в один файл, не прибегая к оберткам в виде массивов и т.п., а также к прочим хитростям?
3. Что происходит при сериализации статических классов? Возможно ли это вообще?

Кроме этих вопросов есть ещё один, не связанный с указанной темой. На одном из сайтов я наткнулся на такой фрагмент кода, который оказался непонятным для меня (как уже было сказано выше, я новичок в C#):

Синтаксис:
Используется csharp
public class Game {
    public static Game current;
    ...
}

Здесь в переменную current не было записано ничего, однако позже к ней обращались как к, по всей видимости, ссылке на экземпляр класса Game. Как это работает?

Заранее спасибо.
Последний раз редактировалось StupidMoth 23 ноя 2019, 20:20, всего редактировалось 1 раз.
Аватара пользователя
StupidMoth
UNец
 
Сообщения: 23
Зарегистрирован: 23 ноя 2019, 17:33

Re: Сериализация данных

Сообщение Jarico 23 ноя 2019, 19:51

Используй BinaryWriter и BinaryReader, с ними можно выполнять любые операции и самое главное ты сам указываешь какие данные записывать...
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Сериализация данных

Сообщение lawsonilka 24 ноя 2019, 09:42

Директива (?) [SerializeField] нужна для обеспечения возможности сериализации приватных полей класса (при этом поля с типом доступа public сразу доступны для сериализации), а [System.Serializable] для того, чтобы мы могли сериализовать экземпляры целого класса (в т.ч. с его приватными полями). Верно ли я понимаю этот момент? И если нет, то в чем ошибаюсь?

В общем верно, но главное запомнить что все это будет работать только в unity, при классический сериализации атрибут SerializeField работать не будет.
Что происходит при сериализации статических классов? Возможно ли это вообще?

Ничего. Статический класс сериализовать невозможно, так как невозможно создать экземпляр такого класса.
Здесь в переменную current не было записано ничего, однако позже к ней обращались как к, по всей видимости, ссылке на экземпляр класса Game. Как это работает?

Возможно где-то создается экземпляр класса Game и записывается в переменную current, возможно это сделано через статический конструктор.
Можем ли мы как-то сериализовать сразу несколько полей/экземпляров класса и записать их в один файл, не прибегая к оберткам в виде массивов и т.п., а также к прочим хитростям?

Ответ на такой вопрос неоднозначный. Так как сохранять можно что угодно и сколько угодно: к примеру взять старые данные, добавить к ним новые и сохранить, либо записать все возможные экземпляры классов в один класс - контейнер и сохранить, но это все совершенно не "хитрости" так и делают. В общем вы сами выбираете как вам сохранять данные, общего правила НЕТ.
lawsonilka
UNIверсал
 
Сообщения: 390
Зарегистрирован: 21 окт 2014, 14:48

Re: Сериализация данных

Сообщение StupidMoth 24 ноя 2019, 17:57

Jarico писал(а):Используй BinaryWriter и BinaryReader, с ними можно выполнять любые операции и самое главное ты сам указываешь какие данные записывать...

Спасибо. Интересные классы, я почитал про них и, похоже, они смогут пригодиться в будущем. Единственный недостаток, как я понял, они работают только с простыми типами данных. Здесь, конечно, можно попробовать привести условный массив, который необходимо сериализовать, к строке, а потом прочесть его из нее, но пока такого не нужно.

lawsonilka писал(а):В общем верно, но главное запомнить что все это будет работать только в unity, при классический сериализации атрибут SerializeField работать не будет.

Ничего. Статический класс сериализовать невозможно, так как невозможно создать экземпляр такого класса.

Благодарю за развернутый ответ. Единственное, что, не совсем уверен на счет этого:
lawsonilka писал(а):Возможно где-то создается экземпляр класса Game и записывается в переменную current, возможно это сделано через статический конструктор.

Но попробую разобраться позже.
Аватара пользователя
StupidMoth
UNец
 
Сообщения: 23
Зарегистрирован: 23 ноя 2019, 17:33

Re: Сериализация данных

Сообщение Jarico 24 ноя 2019, 20:18

StupidMoth писал(а):
Jarico писал(а):Используй BinaryWriter и BinaryReader, с ними можно выполнять любые операции и самое главное ты сам указываешь какие данные записывать...

Спасибо. Интересные классы, я почитал про них и, похоже, они смогут пригодиться в будущем. Единственный недостаток, как я понял, они работают только с простыми типами данных. Здесь, конечно, можно попробовать привести условный массив, который необходимо сериализовать, к строке, а потом прочесть его из нее, но пока такого не нужно.


BinaryWriter и BinaryReader записывают данные в массив байт
пример из моего github https://github.com/ep1s0de3/RakNet_Networking/tree/master/Assets/Scripts/Shared/Networking/Plugins/Stream
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Сериализация данных

Сообщение Axil 10 дек 2019, 15:34

можно попробовать привести условный массив, который необходимо сериализовать, к строке, а потом прочесть его из нее


Фу-фу-фу, нет. Не надо так. Массив так и записывай поэлементно в бинарник. Сначала пишешь размер массива, потом данные. Когда читаешь, то первым делом размер массива, потом столько элементов и читаешь из файла.
Аватара пользователя
Axil
UNIт
 
Сообщения: 51
Зарегистрирован: 02 окт 2019, 11:26

Re: Сериализация данных

Сообщение StupidMoth 17 дек 2019, 13:47

Axil писал(а):
можно попробовать привести условный массив, который необходимо сериализовать, к строке, а потом прочесть его из нее


Фу-фу-фу, нет. Не надо так. Массив так и записывай поэлементно в бинарник. Сначала пишешь размер массива, потом данные. Когда читаешь, то первым делом размер массива, потом столько элементов и читаешь из файла.


И не собираюсь, сказал же.
Аватара пользователя
StupidMoth
UNец
 
Сообщения: 23
Зарегистрирован: 23 ноя 2019, 17:33


Вернуться в Скрипты

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

Сейчас этот форум просматривают: Google [Bot] и гости: 6