Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Eccezione BinaryFormatter.Deserialize: Il flusso non è un formato valido

    Salve.
    Sto realizzando un'applicazione che permette lo scambio di dati tramite tcpclient e tcpserver, e che supporta più client.
    Il mio primo obiettivo sarebbe di implementare una chat multiutente, ho già creato le funzioni che gestiscono i thread e sembrano funzionare bene.
    In particolare mi interessa trasferire una classe (che ho chiamato "pacchetto") utilizzando la serializzazione binaria. La classe è così definita:

    <Serializable()> Public Class pacchetto

    Public idfrom As Integer
    Public idto As Integer
    Public tipo As Integer
    Public dati As String

    Public Sub New(ByVal da As Integer, ByVal a As Integer, ByVal tipodidato As Integer, ByVal messaggio As String)
    idfrom = da
    idto = a
    tipo = tipodidato
    dati = messaggio
    End Sub

    End Class

    Per testare il tutto ho provato ad inviare dal server al client un'istanza di pacchetto, chiamata "welcome", con una semplice frase e l'integer identificativo del client, ma ricevo un'eccezione di Deserialize() che recita:
    "Il flusso di input non è un formato binario valido. Il contenuto iniziale (in byte) è: FF-FF-FF-FF-00-00-00-00-01-00-00-00-06-03-00-00-00 ..."

    Le due funzioni che utilizzo per inviare/ricevere le classi Pacchetto, sono le seguenti:



    Public Sub Scrivi(ByRef streamdascrivere As NetworkStream, ByVal pacchettodainviare As pacchetto)
    Try
    formatter.Serialize(streamdascrivere, CType(pacchettodainviare, Object))
    Catch errorescrivi As Exception
    MsgBox("Errore nella serializzazione" & vbNewLine)
    End Try
    End Sub

    Public Function leggi(ByRef streamdaleggere As NetworkStream) As pacchetto
    Dim pacchettoricevuto As New pacchetto(0, 0, 0, "")
    If streamdaleggere.CanRead Then
    Try
    pacchettoricevuto = formatter.Deserialize(streamdaleggere)
    Catch erroreleggi As Exception
    Form1.stato.AppendText("Errore nella deserializzazione" & vbNewLine)
    End Try
    End If
    Return pacchettoricevuto
    End Function

    Tengo a precisare che la serializzazione, e quindi l'invio di dati, non da alcun errore, presumo quindi che funzioni, poi magari ho sbagliato qualcosa proprio lì..

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Secondo me non puoi serializzare direttamente un'oggetto NetworkStream, ne tanto meno deserializzarlo.

    Inoltre è inutile creare un'istanza della classe pacchetto prima deserializzarla:

    codice:
    Dim pacchettoricevuto As New pacchetto(0, 0, 0, "")
    pacchettoricevuto = formatter.Deserialize(streamdaleggere)
    Diventa:

    codice:
    Dim pacchettoricevuto As  pacchetto
    pacchettoricevuto = formatter.Deserialize(streamdaleggere)
    Sbagliare è umano, perseverare è diabolico.

  3. #3
    ho provato e riprovato, ma non capisco proprio a cosa possa essere dovuto.
    Tengo a precisare che il server e il client sono su due soluzioni diverse, ho fatto copia-incolla della definizione della classe "pacchetto", ma temo non sia sufficiente per avere un oggetto identico..
    In ogni caso ho tentato, anziché utilizzare il networkstream, a creare un filestream per poter controllare meglio come funzionava il meccanismo. Tutto ciò che posso dire è che la serializzazione sembra funzionare come si deve, in quanto alla deserializzazione, il client mi da errore in quanto sostiene che il file è aperto da un altro processo (cosa non vera), ma non è questo ciò su cui mi devo concentrare.

    Ho letto qualcosa riguardo al binaryformat.binder, che lega l'assembly alla classe da trasportare, ma non capisco come si utilizza.
    Anche il .net remoting ha attirato la mia attenzione. Mi chiedo soltanto sia una scelta esatta, dal momento che intendo utilizzare questo progetto come base per progetti futuri che avranno bisogno di latenze anche più ridotte che non quelle richieste da una chat.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da amimaster
    ho provato e riprovato, ma non capisco proprio a cosa possa essere dovuto.
    Tengo a precisare che il server e il client sono su due soluzioni diverse, ho fatto copia-incolla della definizione della classe "pacchetto", ma temo non sia sufficiente per avere un oggetto identico..
    Non capisco che vuoi dire.

    In ogni caso ho tentato, anziché utilizzare il networkstream, a creare un filestream per poter controllare meglio come funzionava il meccanismo.
    Infatti se utilizzi un Filestream la tua serializzazione e deserializzazione avviene avviene correttamente.

    Tutto ciò che posso dire è che la serializzazione sembra funzionare come si deve, in quanto alla deserializzazione, il client mi da errore in quanto sostiene che il file è aperto da un altro processo (cosa non vera), ma non è questo ciò su cui mi devo concentrare.
    Mai hai chiuso lo stream??

    Hai provato ad utilizzare invece la seializzazione di tipo Soap che mi sembra più indicata per un client-server?
    Sbagliare è umano, perseverare è diabolico.

  5. #5
    Originariamente inviato da Pirelli72
    Non capisco che vuoi dire.
    Intendo dire che l'applicazioni client e quella server sono su due progetti diversi di visual studio. Un amico mi ha detto che l'errore che ottengo potrebbe essere dovuto al fatto che sebbene io abbia definito la medesima classe (pacchetto) allo stesso modo ed in entrambi i progetti, non è detto che la riconosca come lo stesso oggetto.


    Originariamente inviato da Pirelli72
    Hai provato ad utilizzare invece la seializzazione di tipo Soap che mi sembra più indicata per un client-server?
    Che tipo di stream dovrei usare per salvare "temporaneamente" i dati da serializzare/deserializzare? Va bene un memorystream?

    Comunque ho appena provato xml.serializer, ma restituisce un'eccezione analoga a quella del binaryformatter (Errore nel documento XML (1, 1).)

  6. #6
    Volevo comunicare che ho risolto da solo, semplicemente il problema era dovuto all'assembly dei due programmi che non era lo stesso, o meglio, ad alcune impostazioni del formatter che sebbene vengano impostate non sortiscono alcun effetto (http://connect.microsoft.com/VisualS...to-deserialize)
    Mi è bastato inserire la classe in una dll e ho risolto
    Grazie comunque a chi ha letto il 3d.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.