С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
13 / 13 / 1
Регистрация: 24.06.2011
Сообщений: 135

Сериализация структур

01.08.2013, 10:19. Показов 2558. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Возник вопрос, почему при сериализации одной и той же структуры в результате получаются различные значения? Причем это случается только при использовании массивов и объектов в структуре.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        public static byte[] Serialize(object anything)
        {
            int size = Marshal.SizeOf(anything);
            byte[] data = new byte[size];
            GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
            Marshal.StructureToPtr(anything, handle.AddrOfPinnedObject(), false);
            handle.Free();
            return data;
        }
        public static T Deserialize<T>(byte[] data)
        {
            GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
            T temp = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
            handle.Free();
            return temp;
        }
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct Pack
        {
            public byte size;//размер пакета - 0
            public byte client;//кому - 1
            public byte sender;//от кого - 2
            public byte type;//тип сообщения
            public object data;//данные
        }
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct UserParam
        {
            public byte model;//размер пакета - 0
            public byte fx;//кому - 1
            public int color;
        }
Причем различие идет только в одном байте.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.08.2013, 10:19
Ответы с готовыми решениями:

Сериализация
Вообщем проблема достаточно простая,есть класс сериализую его как по учебнику,все проходит успешно,но вот в чем проблема,в получаемом xml в...

Сериализация
Есть приложение, структура которого состоит из большого числа мелких классов(~160 шт), которые могут быть изменены(количество полей, их...

сериализация
Помогите пожалуйста с сериализацией..необходимо написать код сериализации для передачи информации по локальной сети...чтобы информация...

6
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
01.08.2013, 11:14
Ну во первых то, что вы делаете это не сериализация, это тупо копирование участка памяти где находится структура. И при такой обработке вы теряете данные из ссылки data.
0
13 / 13 / 1
Регистрация: 24.06.2011
Сообщений: 135
01.08.2013, 11:26  [ТС]
Цитата Сообщение от Anklav Посмотреть сообщение
Ну во первых то, что вы делаете это не сериализация, это тупо копирование участка памяти где находится структура. И при такой обработке вы теряете данные из ссылки data.
А что это?

Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
01.08.2013, 11:30
Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов.
+ метаданные
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
01.08.2013, 11:33
При сериалзицаии копируется ГРАФ объектов, а у вас нет. По этому у вас не сериализация.

Вы бы лучше сохранили данные в файл, закрыли приложение, опять его открыли, и загрузили данные из файла, в ссылочных полях вашего сохраненного объекта будет мусор, после загрузки.
0
13 / 13 / 1
Регистрация: 24.06.2011
Сообщений: 135
01.08.2013, 11:44  [ТС]
Я сам вижу что у меня мусор. Я не могу восстановить этот массив. Так же я не могу использовать стандартную сериализацию, потому, что мне нужно передавать данные по сети, нужен строго установленный заголовок, да и метаданных много слишком.
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
01.08.2013, 12:22
С реализацией своей сериализации вы будете возится дольше, и не факт что получится - лучше.
Чем вам не подходит такой вариант отправки?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
        struct Header//здесь не будет ссылочных типов
        {
            public int Size;
        }
 
        private unsafe byte[] WriteData(object Data)
        {
            int HeadSize = Marshal.SizeOf(typeof(Header));
 
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream datastream = new MemoryStream();
 
            formatter.Serialize(datastream, Data);
            byte[] DataBytes = datastream.ToArray();
 
            Header head = new Header();
            head.Size = DataBytes.Length; 
 
            byte[] Result = new byte[HeadSize + head.Size];
 
            fixed (byte* Pointer = Result)
            {
                Marshal.StructureToPtr(head, new IntPtr(Pointer), false);
            }
 
            Buffer.BlockCopy(DataBytes, 0, Result, HeadSize, head.Size);
 
            return Result;
        }
 
        private unsafe Header ReadHeader(byte[] Data)
        {
            int HeadSize = Marshal.SizeOf(typeof(Header));
 
            byte[] HeadBytes = new byte[HeadSize];
            Buffer.BlockCopy(Data, 0, HeadBytes, 0, HeadBytes.Length);
 
            Header head;
            fixed (byte* Pointer = HeadBytes)
                head = (Header)Marshal.PtrToStructure(new IntPtr(Pointer), typeof(Header));
 
            return head;
        }
 
        private T ReadData<T>(byte[] data, Header head)
        {
            int DataSize = head.Size;
            int HeadSize = Marshal.SizeOf(typeof(Header));
 
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream datastream = new MemoryStream(data);
            datastream.Position = HeadSize;
 
            return (T)formatter.Deserialize(datastream);
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2013, 12:22
Помогаю со студенческими работами здесь

Сериализация
public class IPzag { public BitArray version = new BitArray(4);//номер версии 4 бита public BitArray...

Сериализация
Помогите пожалуйста с сериализацией..необходимо написать код сериализации для передачи информации по локальной сети...чтобы информация...

Сериализация класса
У меня есть класс, который нужно сериализовать. Я использую сериализацию XML: XmlSerializer data = new XmlSerializer(typeof(MyClass));...

Сериализация и наследование
Добрый день. Немного не могу разобраться с сериализацией при наследовании. При запуске программы создаётся объект класса...

Сериализация в MemoryStream
Всем привет, возникло такое затруднение: Сериализую в память некий объект объемом 5-10 мб. Правда этот объект состоит из нескольких 2-х...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru