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

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

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

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

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

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

Заранее спасибо.

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

СообщениеДобавлено: 23 ноя 2019, 19:51
Jarico
Используй BinaryWriter и BinaryReader, с ними можно выполнять любые операции и самое главное ты сам указываешь какие данные записывать...

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

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

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

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

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

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

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

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

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

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

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

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

Но попробую разобраться позже.

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

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

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


BinaryWriter и BinaryReader записывают данные в массив байт
пример из моего github https://github.com/ep1s0de3/RakNet_Networking/tree/master/Assets/Scripts/Shared/Networking/Plugins/Stream

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

СообщениеДобавлено: 10 дек 2019, 15:34
Axil
можно попробовать привести условный массив, который необходимо сериализовать, к строке, а потом прочесть его из нее


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

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

СообщениеДобавлено: 17 дек 2019, 13:47
StupidMoth
Axil писал(а):
можно попробовать привести условный массив, который необходимо сериализовать, к строке, а потом прочесть его из нее


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


И не собираюсь, сказал же.