Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Serializable] 
:(
    Опции темы
zss
Дата 20.1.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



почему для класса
Код

[Serializable]
public class A
{
        [MarshalAs(UnmanagedType.I1)]
        public bool state = false;
        public uint value = 1;
}

[Serializable]
public class B
{
        public uint mode = 0;
        [MarshalAs(UnmanagedType.I1)]
        public bool view = false;
        public A a = new A();
}


метод
Код

B b = new B();
int size = Marshal.SizeOf(b);


вываливает с исключением
Код

An unhandled exception of type 'System.NotSupportedException' occurred in mscorlib.dll


Это сообщение отредактировал(а) zss - 20.1.2007, 21:02
PM MAIL ICQ   Вверх
marcusmae
Дата 20.1.2007, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



zss, по-моему, так не выйдет  smile 
А что, если сделать оба класса структурами?


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
zss
Дата 20.1.2007, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(marcusmae @  20.1.2007,  22:45 Найти цитируемый пост)
А что, если сделать оба класса структурами? 

у структур нет возможности инициализировать поля вне конструктора (засоряет код smile).

Неужели для классов нельзя ?

Это сообщение отредактировал(а) zss - 21.1.2007, 02:02
PM MAIL ICQ   Вверх
zss
Дата 21.1.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



нашел в чем проблемма. Это все из-за класса А. т.к. он создан через new. Когда я его закоментировал - то все нормально.
Странно - ведь он тоже [StructLayout(LayoutKind.Sequential)]. Почему так ?
PM MAIL ICQ   Вверх
marcusmae
Дата 21.1.2007, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата

Это все из-за класса А. т.к. он создан через new. 


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

Цитата

у структур нет возможности инициализировать поля вне конструктора (засоряет код ).


в смысле, нельзя указать значение поля по умолчанию? = Да, но ведь можно их указать в конструкторе структуры. Используя класс, вызов конструктора понадобится в любом случае, так что, непонятно, в чём выигрыш.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
zss
Дата 21.1.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(marcusmae @  21.1.2007,  02:51 Найти цитируемый пост)
в смысле, нельзя указать значение поля по умолчанию? = Да, но ведь можно их указать в конструкторе структуры. Используя класс, вызов конструктора понадобится в любом случае, так что, непонятно, в чём выигрыш.


не понятно почему. и класс и структура унаследованны от object. так в чем проблемма ?
Я не думаю что разработчики маршалинга ограничились только классами. Надеюсь все-таки решение есть smile
PM MAIL ICQ   Вверх
mr.DUDA
Дата 21.1.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



zss, а что всё-таки интересует ? Как передать структуру "as is", или сериализовать класс ?


--------------------
user posted image
PM MAIL WWW   Вверх
zss
Дата 22.1.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



mr.DUDA, как сериализовать класс smile
PM MAIL ICQ   Вверх
mr.DUDA
Дата 22.1.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Тогда Marshal.SizeOf не нужен. Сериализуем объект в стрим, размер стрима и будет искомым sizeof smile


--------------------
user posted image
PM MAIL WWW   Вверх
zss
Дата 22.1.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(mr.DUDA @  22.1.2007,  11:40 Найти цитируемый пост)
Тогда Marshal.SizeOf не нужен. Сериализуем объект в стрим, размер стрима и будет искомым sizeof smile


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

Добавлено @ 12:30 
и как вообще его сериализовать в поток
PM MAIL ICQ   Вверх
mr.DUDA
Дата 22.1.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Пожалуйста, пример:
Код
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1
{
    [Serializable]
    public class A
    {
        public bool state = false;
        public uint value = 1;
    }

    [Serializable]
    public class B
    {
        public uint mode = 0;
        public bool view = false;
        public A a = new A();
    }

    class Program
    {
        static void Main()
        {
            B b = new B();
            
            // получаем байтовый массив
            MemoryStream stream = new MemoryStream();
            BinaryFormatter fmt = new BinaryFormatter();
            fmt.Serialize(stream, b);
            byte[] array = new byte[stream.Length];
            stream.Position = 0;
            stream.Read(array, 0, array.Length);

            // обратная операция - из байтового массива в объект
            stream = new MemoryStream(array);
            B newB = (B)fmt.Deserialize(stream);
        }
    }
}


Добавлено @ 12:58 
Единственное, чем нехороша сериализация - много лишней инфы уходит в поток (имена типов и assembly пишутся 1 раз, но занимают прилично места - до 60..100 байт на тип).


--------------------
user posted image
PM MAIL WWW   Вверх
zss
Дата 22.1.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(mr.DUDA @  22.1.2007,  12:58 Найти цитируемый пост)
Единственное, чем нехороша сериализация - много лишней инфы уходит в поток (имена типов и assembly пишутся 1 раз, но занимают прилично места - до 60..100 байт на тип). 

тоесть в поток и метаданные пишуться ?
Блин - это плохо. Мне нужно чистые данные. Просто у меня кон на С++ и ничего не знает об этих
метаданных. Можно конечно там сериализовать boost-ом но нет гарантии совместимости - разные разработчики.

Остается только маршалить smile Но как тогда маршалить классы. Никак не получается

Добавлено @ 13:09 
З.Ы. Это типичная несовместимость... Надо переходить на Qt smile
PM MAIL ICQ   Вверх
zss
Дата 22.1.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(marcusmae @  21.1.2007,  02:51 Найти цитируемый пост)
в смысле, нельзя указать значение поля по умолчанию? = Да, но ведь можно их указать в конструкторе структуры. Используя класс, вызов конструктора понадобится в любом случае, так что, непонятно, в чём выигрыш.


для структуры [StructLayout(LayoutKind.Sequential)] почему-то не получается создать конструктор по-умолчанию smile

Это сообщение отредактировал(а) zss - 22.1.2007, 14:33
PM MAIL ICQ   Вверх
mr.DUDA
Дата 22.1.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вместо классов можно использовать структуры, тогда можно копировать Marshal-ом в байтовый массив. Структуры почти ничем не отличаются от классов в C#, ну разве что наследование не поддерживают, требуют конструктор с параметрами и не позволяют инициализировать поля при объявлении.

Код
using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    public struct A
    {
        [MarshalAs(UnmanagedType.I1)]
        public bool state;
        public uint value;
        public A(bool s, uint v)
        {
            state = s;
            value = v;
        }
    }

    public struct B
    {
        public uint mode;
        [MarshalAs(UnmanagedType.I1)]
        public bool view;
        public A a;
        
        public B(uint m, bool v)
        {
            a = new A(true, 123);
            view = v;
            mode = m;
        }
    }

    class Program
    {
        static void Main()
        {
            B b = new B(45, false);

            int size = Marshal.SizeOf(b);
            IntPtr ptr = Marshal.AllocHGlobal(size);
            byte[] array = new byte[size];
            Marshal.StructureToPtr(b, ptr, false);
            Marshal.Copy(ptr, array, 0, array.Length);
            Marshal.FreeHGlobal(ptr);
        }
    }
}



Цитата(zss @  22.1.2007,  12:08 Найти цитируемый пост)
 Это типичная несовместимость... Надо переходить на Qt

З.Ы. надо переходить от C++ в полностью managed smile


--------------------
user posted image
PM MAIL WWW   Вверх
zss
Дата 22.1.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(mr.DUDA @  22.1.2007,  14:27 Найти цитируемый пост)
Вместо классов можно использовать структуры, тогда можно копировать Marshal-ом в байтовый массив. Структуры почти ничем не отличаются от классов в C#, ну разве что наследование не поддерживают, требуют конструктор с параметрами и не позволяют инициализировать поля при объявлении.

у меня структура из 30 полей. Так что их все нужно в конструкторе передавать ?
Именно из-за этого я и не хотел использовать структуры.


Цитата(mr.DUDA @  22.1.2007,  14:27 Найти цитируемый пост)
З.Ы. надо переходить от C++ в полностью managed

слабоват он пока. Да и низкоуровневые фишку часто нужны бывают smile
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.