Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Konstantin333
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 3
1

Как передать сериализованный объект по сети?

11.09.2016, 12:07. Просмотров 607. Ответов 5
Метки нет (Все метки)

Подскажите пожалуйста. Есть Сервер (С) на с# и клиент (К) на юнити. Устанавливаем между ними сокетное подключение и пытаемся передать сериализованный класс, причем класс который передаем обсолютно идентичен по исходному коду и на клиенте и на сервере. Но в результате получаем ошибку при десирализации класса в ExEnterWorld 25 строка:
System.IO.FileNotFoundException: Could not load file or assembly 'ServerNew, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'ServerNew, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'


Замечу что раньше мы собирали классы которые передавли в отдельную dll и подключали ее в клиенте и сервере, тогда все работало нормально, но это очень не удобно по этому ищем упрощенный вариант.

Подскажите пожалуйста в какую сторону копать? Я так понимаю что ошибка из-за того что клиент пытается десириализовать именно в экземпляр класса сервера, как это можно обойти?

Вот так выглядит пакет с сериализацией и десирализацией
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
 public class ExEnterWorld: Packet
    {
        public FullPlayerInfoContract CurrPlayer;
        public byte[] ObjData;
        public int ObjDataLenght;
        private string test;
 
        public ExEnterWorld() : base(PacketType.ExEnterWorld) { }
 
        public ExEnterWorld(FullPlayerInfoContract currPlayer)
            : this()
        {
            CurrPlayer = currPlayer;
        }
 
        public override void ReadPacket(PacketReader pr, IPacketHandler handeler)
        {
            pr.BaseStream.Seek(2, SeekOrigin.Begin);
            Length = pr.ReadInt16();
            ObjDataLenght = pr.ReadInt32();
            ObjData = pr.ReadBytes(ObjDataLenght);
            Checksumm = pr.ReadInt16();
            BinaryFormatter binFormatter = new BinaryFormatter();
            MemoryStream mStream = new MemoryStream(ObjData);
            CurrPlayer = (FullPlayerInfoContract)binFormatter.Deserialize(mStream);
        }
 
        public override void WritePacket(PacketWriter pw)
        {
            var binFormatter = new BinaryFormatter();
            var mStream = new MemoryStream();
            binFormatter.Serialize(mStream, CurrPlayer);
            ObjData = mStream.ToArray();
            ObjDataLenght = ObjData.Length;
 
            pw.Write((ushort)Type);
            pw.Seek(2, System.IO.SeekOrigin.Current);
 
            pw.Write(ObjDataLenght);
            pw.Write(ObjData);
 
            short length = (short)(pw.BaseStream.Length + 2);
            pw.Write(length);
 
            pw.Seek(2, System.IO.SeekOrigin.Begin);
            pw.Write(length);
        }
 
        public override string ToString()
        {
            return String.Format("EnterPlayer: CurPlayer[Name: {0}, X: {1}, Y: {2}]", CurrPlayer.Name, CurrPlayer.X,
                CurrPlayer.Y);
        }
 
    }
Вот так сам сериализуемый класс
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
namespace ServerNew.Network.NetworkPackets.Contracts
{
    [Serializable()]
    public class FullPlayerInfoContract
    {
        public int Id { get; set; }
 
        public string Name { get; set; }
        public int MaxHp { get; set; }
        public int MaxMana { get; set; }
        public int Speed { get; set; }
 
        public double X { get; set; }
        public double Y { get; set; }
 
        public bool InWarMode { get; set; }
 
        public bool IsDead { get; set; }
 
        public bool Npc = false;
 
        public FullPlayerInfoContract(int id, double x, double y, string name, int maxHp, int maxMana, int speed, bool warMode, bool isDead, bool npc)
        {
            this.Id = id;
            this.X = x;
            this.Y = y;
            this.Name = "asd";
            this.MaxHp = maxHp;
            this.MaxMana = maxMana;
            this.Speed = speed;
            this.InWarMode = warMode;
            IsDead = isDead;
            this.Npc = npc;
        }
 
        public override bool Equals(object obj)
        {
            var contact2 = obj as FullPlayerInfoContract;
            if (contact2 == null) return false;
            return this.Id == contact2.Id && this.MaxHp == contact2.MaxHp &&
                this.MaxMana == contact2.MaxMana && this.Speed == contact2.Speed &&
                this.X == contact2.X && this.Y == contact2.Y && String.Equals(this.Name, contact2.Name);
        }
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2016, 12:07
Ответы с готовыми решениями:

Как передать значение в сериализованный Dictionary
В общем есть класс для сериализации (нашел в просторах инета) И есть элемент...

Не могу передать сериализованный массив
в предыдущей теме я не выложил весь код программы..программа состоит из сервера...

Процедуры в c# - как передать объект
Добрый день. При вызове процедуры Connect происходит ошибка "невозможно...

Как передать объект от сервера к клиенту?
Только-только знакомплюсь с клиент-серверным программированием. Хочу передать...

Передать объект класса как аргумент метода в поток
Имеется класс npimono, код использования: private void...

5
insite2012
Модератор
Эксперт .NET
4865 / 3818 / 1096
Регистрация: 12.10.2013
Сообщений: 11,095
Записей в блоге: 2
11.09.2016, 12:36 2
Цитата Сообщение от Konstantin333 Посмотреть сообщение
это очень не удобно по этому ищем упрощенный вариант.
Такой уже есть. Это WCF, все создано за вас, берите и пользуйтесь.
0
Konstantin333
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 3
11.09.2016, 15:08  [ТС] 3
Используем асинхронные сокеты, к сожалению WCF не устраивает по скорости.
http://www.udaparts.com/document/articles/fastsocketpro.htm
0
insite2012
Модератор
Эксперт .NET
4865 / 3818 / 1096
Регистрация: 12.10.2013
Сообщений: 11,095
Записей в блоге: 2
11.09.2016, 17:15 4
Цитата Сообщение от Konstantin333 Посмотреть сообщение
WCF не устраивает по скорости.
Раз у вас проблема именно с сериализацией, можно попробовать взять из WCF только этот механизм (использовать для классов контракты данных и сериализатор DataContractSerializer). Этот сериализатор передает только состояние объекта, без информации о сборке и прочем.
1
Storm23
Эксперт .NETАвтор FAQ
6567 / 3980 / 1447
Регистрация: 11.01.2015
Сообщений: 5,149
Записей в блоге: 32
11.09.2016, 20:08 5
Konstantin333,
Используйте либо событие AppDomain.AssemblyResolve и подсовывайте ему другую сборку, когда запросит.

Либо же, если сборки отличаются только версией, то вот так:
C#
1
2
var binFormat = new BinaryFormatter();
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
0
Konstantin333
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 3
11.09.2016, 20:17  [ТС] 6
спасибо с помощью DataContractSerializer решил задачу
0
11.09.2016, 20:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2016, 20:17

Как выглядит сериализованный файл
В общем суть такая - я всегда пользовался своим форматером, который скажем...

Как передать потоковое видео по сети
Ребят, вот подумал над проектом и решил написать программу для удаленного...

Передать строку по сети
Вопрос таков, расшарить бы собственно в лоб а что надо собственно сделать то? ...


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

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

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