Не работает сериализация

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

Не работает сериализация

Сообщение mananasaly 11 апр 2019, 23:57

В приложении есть возможность переключаться между игроками.
Я создала класс "Players", в котором хранится вся нужная информация о конкретном юзере и класс "Users" для работы с этими юзерами.

Синтаксис:
Используется csharp
namespace MyName
{
    [Serializable]

    class Player
    {
        public string name;
        public string cur_animal = "pig";
        public int level = 1;

    }

    class Users
    {

        public List<Player> users = new List<Player>();

        public void AddUser(string name)
        {
            int count = 0; //количество повторений
            for (int i = 0; i < users.Count(); i++)
            {
                if (name == users[i].name)
                {
                    count++;
                    break;
                }
            }

            //если таких больше нет, то записываем его
            if (count == 0)
            {
                Player p = new Player();
                p.name = name;
                users.Add(p);
            }
            else
            {
                //сообщение об ошибке
            }
        }

        public void SaveUsers()
        {
            using (FileStream fin = new FileStream("Gamesave.txt", FileMode.OpenOrCreate))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                users = (List<Player>)formatter.Deserialize(fin);
            }
        }

        public void LoadUsers()
        {
            using (FileStream fout = new FileStream("Gamesave.txt", FileMode.OpenOrCreate))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fout, users);
            }

        }

    }



Каждый раз, как только пользователь жмет кнопку "Сменит игрока", то вызывается следующая функция, которая печатает всех доступных игроков в список.

Синтаксис:
Используется csharp
Users vUsers = new Users();

public void Continue(Dropdown DropDown)
        {
            vUsers.LoadUsers(); // загрузить игроков из памяти
            if (vUsers.users.Count > 0)
            {
                DropDown.ClearOptions();
                for (int i = 0; i < vUsers.users.Count; i++)
                {
                    DropDown.options.Add(new Dropdown.OptionData(vUsers.users[i].name));
                }
            }
            else
            {
                DropDown.ClearOptions();
                DropDown.options.Add(new Dropdown.OptionData("Игроки еще не созданы"));
            }
        }
 


Если добавлять игроков, то они спокойно добавляются в массив и файл перезаписывается, но cреализация почему-то не работает, то есть в файл не выписывается ни один игрок.

P.S. функцию SaveUsers вызываю, и после добавления нового игрока, и после закрытия приложения.

В чем может быть проблема? Заранее большое спасибо.
mananasaly
UNец
 
Сообщения: 10
Зарегистрирован: 30 мар 2019, 23:51

Re: Не работает сериализация

Сообщение 1max1 12 апр 2019, 00:31

Потому что листы не сериализуются простыми методами, для этого нужен либо костыль типа обертки в структуру (или класс), либо другие методы сериализации.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Не работает сериализация

Сообщение Friend123 12 апр 2019, 08:10

1max1 писал(а):Потому что листы не сериализуются простыми методами, для этого нужен либо костыль типа обертки в структуру (или класс), либо другие методы сериализации.

Листы сериализуются, но, если память не изменяет, только простых типов типа int, float и т.п.: https://docs.unity3d.com/ru/current/Manual/script-Serialization.html
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Не работает сериализация

Сообщение seaman 12 апр 2019, 08:15

Вообще то сериализуются.

Как то странно названы методы. Save все же обычно сохранение на диск, а Load читает с диска. У Вас наоборот.
Так что для записи на диск вам нужно вызывать не SaveUsers, а как ни странно LoadUsers
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


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

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

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