Чтение из потока, сериализация и десериализация - PullRequest
0 голосов
/ 25 апреля 2020

Я запускаю клиент-серверное приложение в C# Visual Studio для Ma c версии 8.5.4 (сборка 12), а также GUI, реализованное с использованием GTK. GUI отображает список событий соревнований по плаванию с количеством участников для каждого события.
Когда я нажимаю кнопку, которая назначает данного участника, он обновляет список в каждом подключенном пользователе GUI (с помощью наблюдателя), даже для клиента, который нажал кнопку, но когда я нажимаю ее снова (с того же клиента, что и раньше), с другими входами, происходит сбой только для клиента (даже если сервер отправил обновленный список обратно), который нажал кнопку и GUI зависает, но другие подключенные клиенты GUI обновляются отлично.

Вот ошибка:

Ошибка чтения System.Runtime.Serialization.SerializationException: двоичный поток '255' не содержит допустимый BinaryHeader. Возможные причины: неверное изменение потока или версии объекта между сериализацией и десериализацией. в System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run () [0x00116] в / Users / builder / jenkins / workspace / build-package-osx-mono / 2019-10 / external / bockbuild / builds / mono-x64 /mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryparser.cs:181 at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (обработчик System.Runtime.Remoting.Messaging.HeaderHandler, System. -osx-mono / 2019-10 / external / bockbuild / builds / mono-x64 / mcs / class / referenceource / mscorlib / system / runtime / serialization / formatters / binary / binaryobjectreader.cs: 174 в System.Runtime.Serialization.Formatters .Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHan обработчик dler, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) [0x00099] в / Users / builder / jenkins / workspace / build-package-osx-mono / 2019-10 / external /bockbuild/builds/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:197 в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO Сценарий mono / 2019-10 / external / bockbuild / builds / mono-x64 / mcs / class / referenceource / mscorlib / system / runtime / serialization / formatters / binary / binaryformatter.cs: 173 в System.Runtime.Serialization.Formatters.Binary. BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.Head обработчик erHandler, System.Boolean fCheck) [0x00000] в / Users / builder / jenkins / workspace / build-package-osx-mono / 2019-10 / external / bockbuild / builds / mono-x64 / mcs / class / Referenceource / mscorlib /system/runtime/serialization/formatters/binary/binaryformatter.cs:118 в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [ 0x00000] в / Users / builder / jenkins / workspace / build-package-osx-mono / 2019-10 / external / bockbuild / builds / mono-x64 / mcs / class / referenceource / mscorlib / system / runtime / сериализация / форматтеры / binary / binaryformatter.cs: 149 в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO. Stream serializationStream) [0x00000] в / Users / builder / jenkins / workspace / build-package-osx-mono / 2019-10 / external / bockbuild / builds / mono-x64 / mcs / class / referencesource / mscorlib / system / runtime / serialization / formatters / binary / binaryformatter.cs: 111 в Client.serviceProxy.ServiceProxy.run () [0x00008] в /Users/andreivaran/Projects/ConcursInotSocket/Client/ServiceProxy/ServiceProxy.cs:229 Ошибка чтения System.Runtime.Serialization .SerializationException: входной поток не является допустимым двоичным форматом. Начальное содержание (в байтах): 01-00-00-00-01-00-00-00-00-00-00-0 C -02-00-00-00 ... at System .Runtime.Serialization.Formatters.Binary.SerializationHeaderRecord.Read (System.Runtime.Serialization.Formatters.Binary .__ BinaryParser input) [0x00081] в / Users / builder / jenkins / рабочая область / build-package-osx-mono / 2019-10 /external/bockbuild/builds/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binarycommonclasses.cs:471 в System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.ReadSerializationHeaderRader [0x00006] в / Users / builder / jenkins / workspace / build-package-osx-mono / 2019-10 / external / bockbuild / builds / mono-x64 / mcs / class / referenceource / mscorlib / system / runtime / serialization / formatters /binary/binaryparser.cs:386 в System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run () [0x00008] в / Users / builder / jenkins / workspace / build-package-osx-mono / 2019-10 / external / bockbuild / строит / моно-x64 / MCS / класс / referencesource / mscorlib /system/runtime/serialization/formatters/binary/binaryparser.cs:111 в System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (обработчик System.Runtime.Remoting.Messaging.HeaderHandler, System.Runtime.Serialization.Formatters. Binary .__ BinaryParser serParser, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) [0x00069] в / Users / builder / jenkins / workspace / build-package-osx-10-mon /external/bockbuild/builds/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryobjectreader.cs:174 в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (система .IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler обработчик, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage методCallMessage worksinks / 0/09999] / jens buildpace / jens buildpace / jens buildpace / jens buildpace / jens buildpace / наращивание пакет-OSX-моно / 2019-10 /external/bockbuild/builds/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:197 в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System .IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler обработчик, System.Boolean fCheck, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) [0x00000] в / Users / builder / jenkins / workspace / build-package osx-mono / 2019-10 / external / bockbuild / builds / mono-x64 / mcs / class / referenceource / mscorlib / system / runtime / serialization / formatters / binary / binaryformatter.cs: 173 в System.Runtime.Serialization.Formatters. Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler, System.Boolean fCheck) [0x00000] в / Users / builder / jenkins / workspace / build-package-osx-mono / 2019-10 / внешний / bockbuild / сборки / моно-64 / MCS / класс / referencesource / mscorlib / система / выполнения / сериализации / formatters / binary / binaryformatter.cs: 118 в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x00000] в / Users / builder /jenkins/workspace/build-package-osx-mono/2019-10/external/bockbuild/builds/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:149 в системе. Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream) [0x00000] в / Users / builder / jenkins / workspace / build-package-osx-mono / 2019-10 / внешний / bockbuild / builds / mono-x64 / mcs / class / referenceource / mscorlib / system / runtime / serialization / formatters / binary / binaryformatter.cs: 111 в Client.serviceProxy.ServiceProxy.run () [0x00008] в / Users / andreivaran / Projects / ConcursInotSocket / Client / ServiceProxy / ServiceProxy.cs: 229

Это говорит об ошибке из этой части кода

private void handleUpdate(UpdateResponse update)
        {
            if (update is AssignResponse)
            {
                AssignResponse assignResponse = (AssignResponse)update;
                UpdateListDTO updateListDTO = assignResponse;
                Console.WriteLine("Service proxy");
                try{
                    client.notifyEvent(updateListDTO);
                }
                catch (ServiceExceptions e){
                    Console.WriteLine(e.StackTrace);
                }
            }
        }
public virtual void run(){
            while (!finished){
                try{
                    object response = formatter.Deserialize(stream); //line 229
                    Console.WriteLine("response received " + response);
                    if (response is UpdateResponse){
                        handleUpdate((UpdateResponse)response);
                    }
                    else{
                        lock (responses){
                            responses.Enqueue((Response)response);
                        }
                        _waitHandle.Set();
                    }
                }
                catch (Exception e){
                    Console.WriteLine("Reading error " + e);
                }

            }
        }

Чтобы назначить участника, я отправляю DTO, который содержит ( имя участника, тип и продолжительность события) и я получаю OkResponse и AssignResponse (который содержит UpdateListDTO ) для клиента, который нажал кнопку, и AssignResponse для других подключенных клиентов.
Также во второй раз я не получаю никакого ответа, даже OkResponse. Что означает, что в потоке что-то есть?

...