2016-05-09 1 views
1

Il s'agit d'un code hérité qui échoue parfois, mais je n'arrive pas à comprendre pourquoi.SerializationException: Fin de flux rencontrée avant la fin de l'analyse

using(NetworkStream stream = client.GetStream()) { 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, message_); 
    if(responseHandler_ != null) { 
     Message response = (Message) formatter.Deserialize(stream); // <-- fails here 
     responseHandler_(response, stream); 
    } 
} 

Je l'ai googlé à mort. J'ai essayé de chercher des suggestions mais NetworkStream ne peut pas chercher.

Éditer: Il n'échoue pas toujours. Seulement à l'occasion. Toute aide grandement appréciée.

+0

Avant de désérialiser, réglez la position sur 0 'formatter.Position = 0;' –

+1

@MXD tous les flux ne prennent pas en charge cette fonction. – Kamo

Répondre

0

Dans ce cas, je suggère de copier votre NetworkStream à MemoryStream, ce qui peut chercher - vous pouvez trouver de très bons exemples here.

Avec MemoryStream, vous pouvez réinitialiser l'emplacement de flux après est sérialisé

using(var ms = new MemoryStream(stream) { 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(ms , message_); 
    if(responseHandler_ != null) { 
     ms.Location = 0; 
     Message response = (Message) formatter.Deserialize(ms); 
     responseHandler_(response, ms); 
    } 
} 
+0

Comment transformer stream = client.GetStream en un tableau d'octets que MemoryStream peut prendre dans le constructeur. J'ai essayé ceci, mais après CopyTo le code se bloque var output = new MemoryStream(); \t stream.CopyTo (sortie); – malcie

+0

@malcie s'il vous plaît se référer à l'hyperlien que j'ai ajouté - vous pouvez utiliser la méthode CopyTo et copier d'un flux à l'autre ou juste une méthode personnalisée. – Kamo

+0

J'ai essayé CopyTo mais ça reste bloqué. J'ai maintenant à l'aide (client) { \t en utilisant (flux NetworkStream = client.GetStream()) { \t \t en utilisant (var MemoryStream = new MemoryStream()) { \t \t \t stream.CopyTo (MemoryStream) ; \t \t \t BinaryFormatter formatter = new BinaryFormatter(); \t \t \t formatter.Serialize (memoryStream, message_); \t \t \t si (responseHandler_! = Null) { \t \t \t \t memoryStream.Position = 0; \t \t \t \t Action du message = (Message) formatter.Deserialize (memoryStream); \t \t \t \t responseHandler_ (réponse, mémoireStream); \t \t \t}} \t \t \t}} – malcie

0

Le problème était à côté d'envoyer. L'ajout d'une option "persistante" l'a résolu. Client.LingerState = new LingerOption (true, 10)