Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/67: Рейтинг темы: голосов - 67, средняя оценка - 4.63
7 / 7 / 1
Регистрация: 02.11.2011
Сообщений: 56

Сериализация объекта для передачи по сети

19.04.2012, 18:34. Показов 13318. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте многоуважаемые форумчане.
Взываю к вам, ибо ответа найти я не могу =(

В шарпы пришел из С, и сейчас надо переделать приложение, раннее написанное. Столкнулся со скользким моментом... В С я открывал соккет и бросал туда структуру, в которой хранились данные. Структура отправлялась, а на другой стороне я просто ее принимал и приводил к типу такой же структуры. В шарпах нужно использовать сериализацию объекта, я это понимаю.. Но в инете примеры сериализации только для файлов. В примерах автор открывает поток, допустим Streamwriter и пишет в него объект..

Но вот в чем проблема...

C#
1
2
3
4
5
6
7
8
9
10
11
12
[Serializable]
    public class MSG
    {
        public int type;
        public string message;
        
        public MSG(int t, string m)
        {
            type = t;
            message = m;
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Socket sender;
MSG buf = new MSG(1, "123131");
sender = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
try
{
     sender.Connect(_Addr.ipEndPoint);
}
catch (Exception e)
{
     Console.WriteLine("Не удалось соединиться с сервером:");
     Console.WriteLine(e.Message);
}
Console.WriteLine("Connecting to [{0}] complete",
sender.RemoteEndPoint.ToString());
Строку шлет без проблем, а вот с объектами не понимаю.
Чтобы сериализовать объект хотел использовать
C#
1
2
BinaryFormatter answFormatter = new BinaryFormatter();
answFormatter.Serialize(sender, buf);
Но Serialize работает с потоками, а с соккетами работать отказывается =(
Направьте на путь истинный пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.04.2012, 18:34
Ответы с готовыми решениями:

Сериализация объекта для передачи по TCP
Помогите, нужно передать объект по TCP. Метод Send принимает только массив байтов. Как можно сериализовать объект в массив байтов, дабы...

Сериализация данных для отправки по сети
Я считаю главным параметром данных при отправке данных по сети их размер. Я сталкивался с бинарной , xml , json soap - сериализацией . Так...

Функция вне класса для передачи функции объекта
Добрый вечер, уважаемые форумчане. Столкнулся с таким пунктом в условии задания: Создать функцию вне класса для передачи функции...

9
2 / 2 / 0
Регистрация: 25.03.2012
Сообщений: 31
19.04.2012, 19:06
а MSDN для чего?
http://msdn.microsoft.com/ru-r... 1as27.aspx
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
19.04.2012, 19:09
есть поток MemoryStream
как раз в него можно записать подобные вещи и потом методом ToArray получить массив байтов

кстати говоря на счет структур..
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        struct MyStruct
        {
            public int a;
            public int b;
        }
 
..............
 
            byte[] buffer = new byte[] { 5, 0, 0, 0, 10, 0, 0, 0 };//допустим это из сокета пришло
 
            MyStruct* st;
 
            fixed (byte* pData = buffer)
            {
                st = (MyStruct*)pData;
            }
 
            Console.WriteLine(st->a);  //5
            Console.WriteLine(st->b);  //10
но увлекаться этим особо не стоит )
0
7 / 7 / 1
Регистрация: 02.11.2011
Сообщений: 56
19.04.2012, 19:39  [ТС]
Цитата Сообщение от Evgene-Ivanovic Посмотреть сообщение
В МСДН как раз таки пример с файлами =___=

Добавлено через 19 минут
Цитата Сообщение от m0nax Посмотреть сообщение
есть поток MemoryStream
как раз в него можно записать подобные вещи и потом методом ToArray получить массив байтов

кстати говоря на счет структур..
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        struct MyStruct
        {
            public int a;
            public int b;
        }
 
..............
 
            byte[] buffer = new byte[] { 5, 0, 0, 0, 10, 0, 0, 0 };//допустим это из сокета пришло
 
            MyStruct* st;
 
            fixed (byte* pData = buffer)
            {
                st = (MyStruct*)pData;
            }
 
            Console.WriteLine(st->a);  //5
            Console.WriteLine(st->b);  //10
но увлекаться этим особо не стоит )
Да я не хотел заморачиваться со структурами, и решил делать все объектами.
Пробовал сделать вот так.

Серилизация
C#
1
2
3
4
BinaryFormatter formatter = new BinaryFormatter();          
            MemoryStream stream = new MemoryStream();           
            formatter.Serialize(stream, obj);           
            byte[] msg = stream.ToArray();
Десериализация
C#
1
2
3
4
5
6
7
8
public static MSG Receive (byte[] serializedAsBytes)
        {
            MemoryStream stream = new MemoryStream();           
            BinaryFormatter formatter = new BinaryFormatter();          
            stream.Write(serializedAsBytes, 0, serializedAsBytes.Length);           
            stream.Seek(0, SeekOrigin.Begin);           
            return (MSG)formatter.Deserialize(stream);  
        }
Вылетает исключение
Message: Unable to find assembly

Что я опять не так сделал? о_О
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
19.04.2012, 20:02
во первых лучше сразу создавай new MemoryStream(serializedAsBytes);

а во вторых - чую в 2 разных проектах дело происходит
чтоб BinaryFormatter работал код десериализуемого класса должен быть общий и единый при (де/се)риализации

т.е класс MSG надо вынести в дллку и прицепить ее к обоим проектам
2
7 / 7 / 1
Регистрация: 02.11.2011
Сообщений: 56
19.04.2012, 20:03  [ТС]
Все, вопрос можно считать закрытым.

m0nax, спасибо за помощь! Через memorystream работает, просто где-то в коде ошибся.

Вот моя корявая реализация сериализации (каламбурчик), для тех кому понадобится =))

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
56
57
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO; 
 
namespace Serialization
{
    [Serializable]
    class MSG
    {
        public int type;
        public string message;
        
        public MSG(int i, string s)
        {
            type = i;
            message = s;
        }
    }
    
    class Program
    {
        public static byte[] Serialization (MSG obj)
        {
            BinaryFormatter formatter = new BinaryFormatter();          
            MemoryStream stream = new MemoryStream();           
            formatter.Serialize(stream, obj);           
            byte[] msg = stream.ToArray();
            return msg;
        }
        
        public static MSG DeSerialization (byte[] serializedAsBytes)
        {
            MemoryStream stream = new MemoryStream();           
            BinaryFormatter formatter = new BinaryFormatter();          
            stream.Write(serializedAsBytes, 0, serializedAsBytes.Length);           
            stream.Seek(0, SeekOrigin.Begin);           
            return (MSG)formatter.Deserialize(stream); 
        }
        
        public static void Main(string[] args)
        {
            MSG msg = new MSG(1,"Я не сериализован");
            byte[] buf = new byte[1024];
            
            buf = Serialization(msg);
            
            Console.WriteLine("До сериализации  " + buf);
            
            MSG msg1 = new MSG(2,"Текст");
            msg1 = DeSerialization (buf);
            Console.WriteLine("После сериализации  " + msg1.message);
            
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}
5
2 / 2 / 0
Регистрация: 31.10.2012
Сообщений: 24
02.11.2013, 21:25
Понимаю, тема старая... Но!
Такой вопрос!
А если мне нужно передавать и принимать сразу несколько классов? Скажем больше 10ти. Что делать в этом случаи? Судя с этих методов то ДеСериализация зависит от конкретно принятого класса. Мне же приходит просто "data" которую я должен еще правильно запихнуть в нужный ей метод ДеСериализации. Что в этом случаи делать??
0
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
02.11.2013, 21:31
Цитата Сообщение от Werewolf_Bite Посмотреть сообщение
случаи
****, как хочется высказаться...
Цитата Сообщение от Werewolf_Bite Посмотреть сообщение
Что в этом случаи делать??
отправлять несколько сокетов, например
0
2 / 2 / 0
Регистрация: 31.10.2012
Сообщений: 24
02.11.2013, 21:36
Тут проблема не в отправке, а в приеме скорей.... Приходит, как не крути, просто data типа byte[]. А эту дату нужно запихнуть еще в нужный метод. Вот я и спрашиваю, как это лучше сделать?
0
 Аватар для ksk
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
02.11.2013, 23:09
Вот три подхода, которые можно примерить к данной ситуации:

1. Есть такое слово ASN.1
В полном объёме оно в этом случае вряд ли пригодится, но смысл там в том, что сначала идёт маркер типа данных, потом размер, потом данные в указанном количестве. Этот метод применяется при последовательном обмене данными между коммутаторами сотовой связи. Можно что-то подобное организовать у себя, чтобы собирая с соски набор байтов заполнять ими структуры или классы на принимающей стороне.

2. Но я, если честно, в подобной ситуации передавал через сокеты цельными строками XMLки, на принимающей стороне десериализовывал в XElement, по имени корня определял, какому классу скормить каждую полученную XMLку.

3. Если ситуация позволяет, то есть по обоим концам соединения .net код, то можно организовать wcf канал и кидаться через него xmlками. В этом случае можно либо по контенту полученного xml послания понять, что это за структура, либо для каждого типа структуры применить отдельный метод.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2013, 23:09
Помогаю со студенческими работами здесь

Программа для передачи сообщений по сети
Нужен код который СКОПИРУЕТ мою программу в папку с виндой.(программа для передачи сообшений по сети)

Программа для передачи видео по сети
Мне нужно сделать так, что бы видео с монитора ноутбука транслировалось через локальную сеть на второй ПК и записывалось там. С записью я...

Приложение для передачи файлов по сети
Доброго времени суток всем!!! Я тут новенький да и в программировании тоже. Меня собственно говоря интересует, как написать приложение...

Программа для передачи документов по сети
Доброе утро) мне на работу надо попробывать сделать такую программу: "Автоматизированной системы делопроизводства на базе системы...

ActiveX компонент для передачи данных по сети
Здравствуйте, задался целью написать ActiveX компонент для передачи данных по сети, на языке Visual Basic 6.0. Есть старая SCADA GENESIS32...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru