Сериализация

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

Сериализация

Сообщение Дядя Саша 20 фев 2010, 18:33

Всем доброго времени суток!
Сегодня весь день пропарился с сабжем. Ничего работать не хочет,
поэтому решил поинтересоваться здесь, может кто-нибудь сталкивался уже.
Задача - преобразовать структуру (или класс) в битовый массив (byte[]), на стороне клиента (юнити),
затем получив этот массив на сервере (C# приложение) преобразовать обратно в структуру.
Пробовал вариант с маршалингом - но он работает только в unsafe, а это только в версии Pro.
Еще вес день копаюсь с сериализацией, но пока безрезультатно и идеи уже закончились.
Сравнивал побайтно массивы исходящий с клиента и приходящий на сервер - они полностью идентичны.
Ошибка появляется на месте вызова - formatter.Deserialize(memory_stream); в виде -
An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll
Additional information: Unable to find assembly '7608b11b759a46b4dac60617b3317c05'.
Пробовал делать сериализацию и десириализацию объекта на сервере - все работает нормально.
Думаю здесь возможны 2 варианта - либо Юнити сериализует не так как десериализует шарп_приложение, либо
это какое-то ограничение бесплатной версии. Но в подтверждении этих догадок в инете ничего не нарыл.
Буду благодарен за любую наводку.
Дядя Саша
UNIт
 
Сообщения: 93
Зарегистрирован: 20 янв 2010, 17:58
Откуда: Новосибирск
  • ICQ

Re: Сериализация

Сообщение Neodrop 20 фев 2010, 19:10

[V] Вариант 1 : Упаковать сохраняемый класс в .NET dll. Все будет отлично работать. Проверено не раз.
[V] Вариант 2 : http://answers.unity3d.com/questions/97 ... ame-option Не проверял. Но, думаю так же будет работать.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Сериализация

Сообщение Дядя Саша 20 фев 2010, 19:34

Вариант 2 выдает ту же ошибку.
А по первому варианту можно поподробнее? Как упаковать сохраняемый класс?
Просто я с шарпом еще знаком не особо долго и если вопрос нубский не обессудьте. :)
Дядя Саша
UNIт
 
Сообщения: 93
Зарегистрирован: 20 янв 2010, 17:58
Откуда: Новосибирск
  • ICQ

Re: Сериализация

Сообщение Neodrop 20 фев 2010, 19:51

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

Re: Сериализация

Сообщение Дядя Саша 20 фев 2010, 19:53

Спасибо большое. Буду разбираться.
Дядя Саша
UNIт
 
Сообщения: 93
Зарегистрирован: 20 янв 2010, 17:58
Откуда: Новосибирск
  • ICQ

Re: Сериализация

Сообщение Neodrop 20 фев 2010, 20:01

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

Re: Сериализация

Сообщение Neodrop 20 фев 2010, 20:05

Реализация SaveCarsData.dll
Интерфейс IDisposable реализован для управляемой очистки памяти.

Синтаксис:
Используется csharp
using System;
using UnityEngine;

namespace SaveCarsData
{
    [System.Serializable]
    public class CarPrefabs :
    {
        public string prefabName;
        private bool disposed;

        public CarPrefabs(string prefabName)
        {
            this.prefabName = prefabName;
        }

        public void Dispose()
        {
            if (disposed) return;
            disposed = true;
            prefabName = "";
        }
    }

    [System.Serializable]
    public class DataHolder : IDisposable
    {
        public Data[] data;
        private bool disposed;
        public DataHolder(int length)
        {
            data = new Data[length];
        }

        public void Dispose()
        {
            if (disposed || data == null) return;
            int count = data.Length;
            for (int i = 0; i < count; i++)
            {
                if (data[i] == null) continue;
                data[i].Dispose();
                data[i] = null;
            }
            data = null;
            GC.SuppressFinalize(this);
            disposed = true;
        }
    }

    [System.Serializable]
    public class Data : IDisposable
    {
        private float vx, vy, vz, qx, qy, qz, qw;

        public Data(Vector3 pos, Quaternion rot)
        {
            vx = pos.x;
            vy = pos.y;
            vz = pos.z;

            qx = rot.x;
            qy = rot.y;
            qz = rot.z;
            qw = rot.w;
        }

        public Data(Transform tr)
        {
            ResetData(tr);
        }

        public void Dispose()
        {
        }

        public void ResetData(Transform tr)
        {
            vx = tr.position.x;
            vy = tr.position.y;
            vz = tr.position.z;

            qx = tr.rotation.x;
            qy = tr.rotation.y;
            qz = tr.rotation.z;
            qw = tr.rotation.w;
        }

        protected Vector3 GetPosition()
        {
            return new Vector3(vx, vy, vz);
        }

        protected Quaternion GetRotation()
        {
            return new Quaternion(qx, qy, qz, qw);
        }

        public void SetPosition(Transform tr)
        {
            tr.position = GetPosition();
            tr.rotation = GetRotation();
        }
    }
}
 
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Сериализация

Сообщение Дядя Саша 20 фев 2010, 20:16

Первый вариант с упаковкой сохраняемого класса в Net Dll сработал отлично!
Еще раз спасибо огромное!
Значит день прошел не зря. :)
Дядя Саша
UNIт
 
Сообщения: 93
Зарегистрирован: 20 янв 2010, 17:58
Откуда: Новосибирск
  • ICQ


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

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

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