Problema deserializzazione C#

di il
6 risposte

Problema deserializzazione C#

Ciao a tutti,sto facendo un programmino con un client e un server in cui il client serializza un oggetto "fai da te" di tipo "primo", e lo invia al server che a sua volta lo deve deserializzare e visualizzare i valori dei propri membri;
ecco il codice:

Client

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable]
class primo
{
    public string nome;
    public int i;
}

class Program
{
    static void Main(string[] args)
    {
        primo x = new primo();

        x.nome = "ciao";
        x.i = 10;

        TcpClient client = new TcpClient("127.0.0.1", 6000);
        IFormatter formatter = new BinaryFormatter();

        Stream dati_s = client.GetStream();
        formatter.Serialize(dati_s, x);

        
}
}

Server

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable]
class primo
{
    public string nome;
    public int i;
}
    

class Program
    {
        
        static void Main(string[] args)
        {

            TcpListener server = new TcpListener(6000);
            server.Start();

            while (true)
            {
                client = server.AcceptTcpClient();//attendo richiesta(ricevo socket)
                Console.Write("\n Client connesso\n");
                
                Stream stream = client.GetStream();
                byte[] username = new byte[10000];
               
                primo d = new primo();
                
               IFormatter forma = new BinaryFormatter();

                d = (primo)forma.Deserialize(stream);
               
                }
        }
    }

il mio problema è che durante la deserializzazione ricevo la seguente eccezione:

Impossibile trovare l'assembly 'NomeprogrammaClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Come potrei risolvere?

Grazie a tutti

6 Risposte

  • Re: Problema deserializzazione C#

    Nessuno che mi puó aiutare?
  • Re: Problema deserializzazione C#

    Metti la classe da trasmettere in una libreria e collega la libreria ad entrambi i progetti (client e server).
    Il programma server non conosce la struttura dell'oggetto che gli hai spedito per cui non riesce a deserializzarlo.
    Ciao
  • Re: Problema deserializzazione C#

    Ciao,non riesco a capire il perchè il programma server non riesca a capire la struttura dell'oggetto che sta ricevendo(classe primo), io l'ho pure dichiarata la struttura della classe primo nel programma server.
  • Re: Problema deserializzazione C#

    Ciao dna_programmer

    dna_programmer ha scritto:


    ciao,non riesco a capire il perchè il programma server non riesca a capire la struttura dell'oggetto che sta ricevendo(classe primo), io l'ho pure dichiarata la struttura della classe primo nel programma server.
    Semplicemente perchè si tratta di due classi diverse, hanno lo stesso nome è la stessa struttura ma sono due classi distinte appartenenti a contesti diversi.

    Ad esempio
    
    
    namespace A
    {
        [Serializable]
        class primo
        {
            public string nome;
            public int i;
        }
        
    }
    
    namespace B
    {
        [Serializable]
        class primo
        {
            public string nome;
            public int i;
        }
    
    }
    
    Quale classe 'primo' bisogna istanziare? A.primo o B.primo o un altro ancora? Nei dati serializzati c'è indicato a quale assembly (o namespace ecc) fare riferimento. Solo che il tuo programma server non contiene quell' assembly e non conosce quella specifica classe 'primo'.

    Il modo più semplice è quello suggerito da hotzambo, cioè linkare l' assembly che contiene la tua classe.

    Se poi questo fosse impossibile si può aggirare il problema usando un SerializationBinder.
  • Re: Problema deserializzazione C#

    Ciao barba,ho visto come si usa il serializationbinder, ma in parole povere di che si tratta?
  • Re: Problema deserializzazione C#

    In pratica nel file serializzato sono scritte le informazioni necessarie per ricreare la classe. Queste informazioni sono, il nome della classe, il nome dell' assembly, e la versione dell' assembly.

    Una situazione comune è che tu possieda una versione diversa (precedente o sucessiva) dell' assembly, in questo caso non è possibile creare l' oggetto.

    Con un SerializationBinder puoi controllare la creazione dell' oggetto ed indicare eventualmente un assembly diverso.
Devi accedere o registrarti per scrivere nel forum
6 risposte