Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
timka23
0 / 0 / 1
Регистрация: 29.06.2012
Сообщений: 47
#1

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

22.11.2016, 22:57. Просмотров 750. Ответов 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
Помогите, нужно передать объект по TCP. Метод Send принимает только массив...

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

Передача объектов класса (TCP)
Добрый день! Пишу клиент-серверное приложение. Основная задача сервера,...

Бинарная сериализация класса без подписчиков на его событие
Здравствуйте. Продемонстрирую проблему на упрощенном примере. Есть класс...

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

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

Добавлено через 1 минуту
И поля в классе Person надо заменить на свойства.
0
timka23
0 / 0 / 1
Регистрация: 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
Злой няш
1406 / 1104 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
22.11.2016, 23:19 #4
Похоже стандартный класс для сериализации Person в результирующий массив байтов дописывает мета-информацию о сборке. Размести весь код в одном проекте или помести класс Person в общую отдельную библиотеку.
1
timka23
0 / 0 / 1
Регистрация: 29.06.2012
Сообщений: 47
22.11.2016, 23:25  [ТС] #5
Буду пытаться, хотя ни разу не делал.
0
timka23
0 / 0 / 1
Регистрация: 29.06.2012
Сообщений: 47
24.11.2016, 23:05  [ТС] #6
Что-то у меня туже ошибку выдает если подключать библиотеку. А разместить код в одном проект чтобы он еще и работал как нужно у меня не получилось .
Прикрепил проекты.
0
Вложения
Тип файла: zip Project.zip (89.5 Кб, 4 просмотров)
sldp
282 / 286 / 112
Регистрация: 29.10.2011
Сообщений: 957
Завершенные тесты: 2
24.11.2016, 23:24 #7
Вам нужно модель данных и тот класс, который за сериализацию отвечает вынести в отдельную длл. и использовать ее 2х проектах. Но лучше так не делать, ибо намучаетесь в будущем Проще JSON, а лучше средствами WCF
0
I2um1
Злой няш
1406 / 1104 / 374
Регистрация: 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 / 1
Регистрация: 29.06.2012
Сообщений: 47
24.11.2016, 23:39  [ТС] #9
Это задание по учебе и нужно сделать 2 отдельных приложения сервер и клиент (который сериализованным объектом передает класс).
0
I2um1
Злой няш
1406 / 1104 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
24.11.2016, 23:45 #10
Цитата Сообщение от timka23 Посмотреть сообщение
нужно сделать 2 отдельных приложения сервер и клиент
Если проекты TcpServer и TcpClient имеют тип консольного приложения, а общая библиотека типа DLL, то на выходе получится два отдельных exe файла.

Добавлено через 2 минуты
Написать по шагам как создать 3 проекта в одном солюшене?
0
timka23
0 / 0 / 1
Регистрация: 29.06.2012
Сообщений: 47
25.11.2016, 00:38  [ТС] #11
Непонятная ошибка: Ошибка 1 Имя типа или пространства имен "ClassLibrary1" отсутствует в пространстве имен "System" (пропущена ссылка на сборку?)
Ссылку на библиотеку сделал, но ошибка не пропадает.
0
Вложения
Тип файла: zip TcpClient.zip (39.1 Кб, 2 просмотров)
Someone007
2177 / 1766 / 798
Регистрация: 09.05.2015
Сообщений: 4,365
Завершенные тесты: 1
25.11.2016, 01:41 #12
Лучший ответ Сообщение было отмечено timka23 как решение

Решение

Вот сделал вам нормальный Reference на сборку.
1
Вложения
Тип файла: zip ProjectFix.zip (10.6 Кб, 19 просмотров)
25.11.2016, 01:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2016, 01:41

Передача имени класса и создание экземпляра соответствующего объекта
Добрый день! В моем приложении часто используется код: if...

Сериализация объекта
public class UserObject { public string variable1{ get;...

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


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

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

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