Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 4
1

Unserialize не работает в реализации сохранения для игры на Unity

30.10.2014, 23:31. Просмотров 1068. Ответов 1
Метки нет (Все метки)


здрасти, я новичек, хочу сделать сохранялку для игры на юнити (там на си шарпе можно скриптить)

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


весь косяк происходит на моменте загрузки при десериализации, но только если объем сохраняемых данных большой (напрмер 8кб уже не загружает, а 2 кб норм грузит)

приведу кусок кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void Save(string path, T data){
        MemoryStream ms = new MemoryStream ();
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(ms, data);
        Debug.Log ("len1 = "+ms.Length);
        string original = Encoding.ASCII.GetString (ms.ToArray ());
        byte[] encrypted;
        Rijndael myRijndael = Rijndael.Create ();
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(cryptKey, SALT);
        myRijndael.Key = pdb.GetBytes(32);
        myRijndael.IV = pdb.GetBytes (16);
        encrypted = EncryptStringToBytes(original, myRijndael.Key, myRijndael.IV);
        FileStream fs = new FileStream (path, FileMode.Create, FileAccess.Write, FileShare.Write);
        fs.Write (encrypted, 0, encrypted.Length);
        fs.Close ();
    }
этот кусок всегда норм срабатывает, в логе дает (например) len1 = 6611
далее загружаю тот же самый файл
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static T Load(string path){
        FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
        int numBytesToRead = (int)fs.Length;
        int numBytesRead = 0;
        byte[] bytes = new byte[numBytesToRead];
        while (numBytesToRead > 0){
            int n = fs.Read(bytes, numBytesRead, numBytesToRead);
            if (n == 0) break;
            numBytesRead += n;
            numBytesToRead -= n;
        }
        fs.Close();
        Rijndael myRijndael = Rijndael.Create ();
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(cryptKey, SALT);
        myRijndael.Key = pdb.GetBytes(32);
        myRijndael.IV = pdb.GetBytes (16);
        string decoded = DecryptStringFromBytes(bytes, myRijndael.Key, myRijndael.IV);
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(decoded));
        Debug.Log ("len2 = "+ms.Length);
        BinaryFormatter formatter = new BinaryFormatter();
        T ret = (T)formatter.Deserialize(ms);
        return ret;
    }
в логе дает len2 = 6611
ошибку дает строка T ret = (T)formatter.Deserialize(ms);
повторюсь, на маленьких файлах все норм, а на большом глюк, ошибка такая:



Код
SerializationException: Unexpected binary element: 9
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element, System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value, System.Runtime.Serialization.SerializationInfo& info) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:254)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (System.IO.BinaryReader reader) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:154)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem, System.IO.BinaryReader reader, Boolean readHeaders, System.Object& result, System.Runtime.Remoting.Messaging.Header[]& headers) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:110)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:179)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:136)
Serializer`1[saveDataType].Load (System.String path) (at Assets/scripts/saveLoadGame.cs:163)
saveLoadGame.loadGameData (Int32 slot) (at Assets/scripts/saveLoadGame.cs:73)
playerGUI.OnGUI () (at Assets/scripts/player/playerGUI.cs:132)




типы сериализуемых данных: List<string> и string ну и свои типы, в которых комбинации предыдущих типов



господа, подскажите как прознать че исправить, че как ваще быть?!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2014, 23:31
Ответы с готовыми решениями:

Есть тут кто пишет на C# для Unity? Под игры созданные в Unity читы делаются?
Привет. Есть тут кто пишет на C# для Unity? Под игры созданные в Unity читы делаются? Такое...

Есть ли здесь ошибка? Писал скрипт в Unity для игры, но почему-то при запуске все зависает и нечего не работает
Я скинул пару примеров с циклами может ошибка в них. 1) int Amaunt = 0; foreach (int...

Как создавать точки сохранения в unity? Чтобы если персонаж упал, то он возвращался на определенную точку сохранения
Я подключил библиотеку : using UnityEngine.SceneManagement; Далее подключил условие, если...

Не работает функция unserialize
нормальный сериализованный массив функция не десериализует! или есть у кого-то рабочая функция,...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
1
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 4
12.11.2014, 14:37  [ТС] 2
че совсем нет идей?

Добавлено через 23 часа 46 минут
может из-за кодировки?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2014, 14:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Меню для игры на Unity
using System.Collections; using System.Collections.Generic; using UnityEngine; using...

Библиотека классов на C# для игры на Unity
NullReferenceException: Object reference not set to an instance of an object -...

Нужен совет в создании сервера для мобильной игры на Unity
Есть проект мобильной игры, клиент будет делаться на Unity. В ней будет арена с битвой двух игроков...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.