Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
timka23
0 / 0 / 0
Регистрация: 29.06.2012
Сообщений: 47
#1

Сериализация объекта класса и передача его по TCP - C#

22.11.2016, 22:57. Просмотров 637. Ответов 11
Метки нет (Все метки)

Отредактировал найденный пример из сети, но при работе клиента выбивает ошибку: Необработанное исключение типа ссылая на formatter.Serialize(strm, p);

Клиент:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ClientTcp
{
    class  Program
    {
        class Person
        {
            public string FirstName;
            public string LastName;
            public int age;
 
            public Person(string i, string s, int k)
            {
                FirstName = i;
                LastName = s;
                age = k;
            }
        }
        public static void Main()
        {
            try 
            { 
                string serverIp = "127.0.0.1";
                Int32 port = 9050;
                Person p = new Person("Иван", "Иванов", 20);
                TcpClient client = new TcpClient(serverIp, port);
                IFormatter formatter = new BinaryFormatter(); // Модуль форматирования, который будет сериализовать класс
 
                NetworkStream strm = client.GetStream(); // поток
                formatter.Serialize(strm, p); // процесс сериализации
 
                strm.Close();
                client.Close();
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e);
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            Console.WriteLine("\nНажмите enter для продолжения...");
            Console.Read();
        }
    }
}
Сервер:
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.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
 
 
namespace TcpServer
{
    class Programm
    {
        class Person
        {
            public string FirstName;
            public string LastName;
            public int age;
 
            public Person(string i, string s, int k)
            {
                FirstName = i;
                LastName = s;
                age = k;
            }
        }
        public static void Main()
        {
           try 
            { 
            TcpListener server = new TcpListener(9050);
            server.Start();
            TcpClient client = server.AcceptTcpClient();
            NetworkStream strm = client.GetStream();
            IFormatter formatter = new BinaryFormatter();
            Person p = (Person)formatter.Deserialize(strm);
            Console.WriteLine("Меня зовут: " + p.FirstName + " " + p.LastName + " и мне " + p.age);
 
            strm.Close();
            client.Close();
            server.Stop();
            }
           catch (ArgumentNullException e)
           {
               Console.WriteLine("ArgumentNullException: {0}", e);
           }
           catch (SocketException e)
           {
               Console.WriteLine("SocketException: {0}", e);
           }
           Console.WriteLine("\nНажмите enter для продолжения...");
           Console.Read();
        }
    } 
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2016, 22:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сериализация объекта класса и передача его по TCP (C#):

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

Сериализация объекта класса - C#
Здравствуйте! Подскажите как должен выглядеть класс что бы по сериализации объекта этого класса получить xml не только с элементами но и...

.NET 3.x Бинарная сериализация класса без подписчиков на его событие - C#
Здравствуйте. Продемонстрирую проблему на упрощенном примере. Есть класс EventingClass, у которого есть события OnSave и OnLoad, на...

Передача события из объекта класса - C#
Здравствуйте! Я только изучаю C#, вопрос касается событий. Предположим, у меня два класса А и Б. В А есть функция, в которой...

Сериализация объекта - C#
У меня есть абстрактный метод: public abstract void save(); Вот его одна из вариаций переопределения public override void save()...

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

11
I2um1
Злой няш
1405 / 1103 / 142
Регистрация: 05.04.2010
Сообщений: 1,949
22.11.2016, 23:05 #2
Класс Person надо пометить атрибутом [Serializable].

Добавлено через 1 минуту
И поля в классе Person надо заменить на свойства.
0
timka23
0 / 0 / 0
Регистрация: 29.06.2012
Сообщений: 47
22.11.2016, 23:13  [ТС] #3
Теперь ошибка на сервер: Необработанное исключение типа - Person p = (Person)formatter.Deserialize(strm);

Клиент:
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.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ClientTcp
{
    class  Program
    {
        [Serializable]
        class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int age { get; set; }
 
            public Person(string i, string s, int k)
            {
                FirstName = i;
                LastName = s;
                age = k;
            }
        }
        public static void Main()
        {
            try 
            { 
                string serverIp = "127.0.0.1";
                Int32 port = 9050;
                Person p = new Person("Иван", "Иванов", 20);
                TcpClient client = new TcpClient(serverIp, port);
                IFormatter formatter = new BinaryFormatter(); // Модуль форматирования, который будет сериализовать класс
 
                NetworkStream strm = client.GetStream(); // поток
                formatter.Serialize(strm, p); // процесс сериализации
 
                strm.Close();
                client.Close();
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e);
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            Console.WriteLine("\nНажмите enter для продолжения...");
            Console.Read();
        }
    }
}
Сервер:
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
58
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
 
 
namespace TcpServer
{
    class Programm
    {
        [Serializable]
        class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int age { get; set; }
 
            public Person(string i, string s, int k)
            {
                FirstName = i;
                LastName = s;
                age = k;
            }
        }
        public static void Main()
        {
           try 
            { 
            TcpListener server = new TcpListener(9050);
            server.Start();
            TcpClient client = server.AcceptTcpClient();
            NetworkStream strm = client.GetStream();
            IFormatter formatter = new BinaryFormatter();
            Person p = (Person)formatter.Deserialize(strm);
            Console.WriteLine("Меня зовут: " + p.FirstName + " " + p.LastName + " и мне " + p.age);
 
            strm.Close();
            client.Close();
            server.Stop();
            }
           catch (ArgumentNullException e)
           {
               Console.WriteLine("ArgumentNullException: {0}", e);
           }
           catch (SocketException e)
           {
               Console.WriteLine("SocketException: {0}", e);
           }
           Console.WriteLine("\nНажмите enter для продолжения...");
           Console.Read();
        }
    } 
}
0
I2um1
Злой няш
1405 / 1103 / 142
Регистрация: 05.04.2010
Сообщений: 1,949
22.11.2016, 23:19 #4
Похоже стандартный класс для сериализации Person в результирующий массив байтов дописывает мета-информацию о сборке. Размести весь код в одном проекте или помести класс Person в общую отдельную библиотеку.
1
timka23
0 / 0 / 0
Регистрация: 29.06.2012
Сообщений: 47
22.11.2016, 23:25  [ТС] #5
Буду пытаться, хотя ни разу не делал.
0
timka23
0 / 0 / 0
Регистрация: 29.06.2012
Сообщений: 47
24.11.2016, 23:05  [ТС] #6
Что-то у меня туже ошибку выдает если подключать библиотеку. А разместить код в одном проект чтобы он еще и работал как нужно у меня не получилось .
Прикрепил проекты.
0
Вложения
Тип файла: zip Project.zip (89.5 Кб, 4 просмотров)
sldp
281 / 285 / 77
Регистрация: 29.10.2011
Сообщений: 951
Завершенные тесты: 2
24.11.2016, 23:24 #7
Вам нужно модель данных и тот класс, который за сериализацию отвечает вынести в отдельную длл. и использовать ее 2х проектах. Но лучше так не делать, ибо намучаетесь в будущем Проще JSON, а лучше средствами WCF
0
I2um1
Злой няш
1405 / 1103 / 142
Регистрация: 05.04.2010
Сообщений: 1,949
24.11.2016, 23:34 #8
Цитата Сообщение от timka23 Посмотреть сообщение
Что-то у меня туже ошибку выдает если подключать библиотеку
1. Надо удалить Person из сервера и клиента, а вместо него использовать Person из общей библиотеки.
2. Лучше сделай один солюшен с тремя проектами.

Цитата Сообщение от timka23 Посмотреть сообщение
А разместить код в одном проект чтобы он еще и работал как нужно у меня не получилось
Я когда проверял твой код, поместил весь код в один класс Program. Main клиента переименовал в Client, Main сервера - в Server. А в методе Main написал:
C#
1
2
3
4
5
bool isServer = Console.ReadLine() == "s";
if (isServer)
    Server();
else
    Client();
Добавлено через 2 минуты
Цитата Сообщение от sldp Посмотреть сообщение
Проще JSON
Проще, но не лучше. Лучше не использовать стандартный класс для бинарной сериализации, а найти стороннею библиотеку.

Цитата Сообщение от sldp Посмотреть сообщение
а лучше средствами WCF
Из пушки по воробьям.
0
timka23
0 / 0 / 0
Регистрация: 29.06.2012
Сообщений: 47
24.11.2016, 23:39  [ТС] #9
Это задание по учебе и нужно сделать 2 отдельных приложения сервер и клиент (который сериализованным объектом передает класс).
0
I2um1
Злой няш
1405 / 1103 / 142
Регистрация: 05.04.2010
Сообщений: 1,949
24.11.2016, 23:45 #10
Цитата Сообщение от timka23 Посмотреть сообщение
нужно сделать 2 отдельных приложения сервер и клиент
Если проекты TcpServer и TcpClient имеют тип консольного приложения, а общая библиотека типа DLL, то на выходе получится два отдельных exe файла.

Добавлено через 2 минуты
Написать по шагам как создать 3 проекта в одном солюшене?
0
timka23
0 / 0 / 0
Регистрация: 29.06.2012
Сообщений: 47
25.11.2016, 00:38  [ТС] #11
Непонятная ошибка: Ошибка 1 Имя типа или пространства имен "ClassLibrary1" отсутствует в пространстве имен "System" (пропущена ссылка на сборку?)
Ссылку на библиотеку сделал, но ошибка не пропадает.
0
Вложения
Тип файла: zip TcpClient.zip (39.1 Кб, 1 просмотров)
Someone007
1875 / 1561 / 570
Регистрация: 09.05.2015
Сообщений: 3,901
Завершенные тесты: 1
25.11.2016, 01:41 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот сделал вам нормальный Reference на сборку.
1
Вложения
Тип файла: zip ProjectFix.zip (10.6 Кб, 17 просмотров)
25.11.2016, 01:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2016, 01:41
Привет! Вот еще темы с ответами:

Сериализация объекта с делегатом - C#
Есть класс, есть делегат. public delegate void WordDelegate(); public class Word { public...

Работа с классом: сериализация объекта - C#
Здравствуйте. Решил попробовать сериализовать объект. SendDocumentResponse response1 = new SendDocumentResponse(); ...

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

Не работает сериализация объекта Queue<string> - C#
Пытаюсь по примеру сохранить объект через XmlSerializer. Выдает ошибку System.InvalidOperationException using System; using...


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

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

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