Serializzazione Deserializzazione Matrice

di il
9 risposte

Serializzazione Deserializzazione Matrice

Salve a Tutti,
ho iniziato un corso di informatica.
Non riesco a capire cosa si intende quando si parla di serializzare / deserializzare.
L'esempio pratico al quale faccio riferimento è la sterilizzazione di una matrice n x n.

cosa significa serializzare i n^2 elementi?

e di conseguenza, cosa significa deserializzare?

Ho immaginato che significhi :

Mat:
2 4
6 8

Serializzare significa creare uno stream del tipo <2468>?

e deserializzare?

da uno stream <2468>,
popolare una matrice n x n :
2 4
6 8

Scusate ma non capisco proprio.

9 Risposte

  • Re: Serializzazione Deserializzazione Matrice

    È corretto. È un po' più complicato nel caso degli oggetti ma il succo è quello: creare una stringa di byte da spedire o memorizzare, dalla quale si possa ricostruire l'oggetto di partenza
  • Re: Serializzazione Deserializzazione Matrice

    Esattamente.
    Tanto per generalizzare un po'.

    Supponi di avere una struttura dati complicata a piacere: una matrice, una matrice di matrici, o qualunque cosa tu riesca ad immaginare.

    Ora, questa struttura dati la devi traferire, tale e quale, ad un'altro programma che sta' in un'altro computer collegato al primo attraverso un cavo (ad esempio Internet, che puoi pensare come un semplice cavo ma che in realta' e' infinitamente piu' complesso)

    Come fare, visto che sul cavo puo' passare SOLO un byte alla volta? Ovviamente dopo il primo byte ne puoi inviare un'altro e poi un'altro, e cosi' via... In SERIE

    Le operazioni di serializzazione/deserializzazione (vanno SEMPRE in coppia, ovviamente) sono delle operazione che vanno progettatate in modo tale da poter convertire la struttura dati in una SERIE di byte da inviare attraverso il cavo e, dall'altra parte, ricevere la SERIE di byte e ricostruire ESATTAMENTE la stessa struttura dati.

    Si procede per passi:
    1) si deve poter inviare tipi semplici (char, int, float,..
    2) si deve poter inviare vettori di tipi semplici
    3) si deve poter inviare strutture composte da tipi semplici
    4) si deve poter inviare vettori o strutture di tipi in formato 1,2,3,4

    Il 'casino' nasce con i puntatori che NON POSSONO essere traferiti, perche' NON ESISTE NESSUN MODO per assicurare che la struttura dati possa essere ricostruita nel computer di destinazione ESATTAMENTE allo stesso indirizzo di memoria. Quindi bisogna inventatsi dei trucvhi super trucchettosi per agirare la rogna rognosa. MA si puo' fare, ovviamente

    MA questa e' un'altra storia

    Tanto per generalizzare un po' il tuo esempio: hai serializzato/deserialuzzato una matrice 2x2.
    Ma se dovessi progettare la ser/deser per matrici di QUALUNQUE dimensione (3x3, 5x5, 20x20 o anche 6x8, 3x5,...) come potresti fare?
  • Re: Serializzazione Deserializzazione Matrice

    migliorabile ha scritto:


    Esattamente.
    Tanto per generalizzare un po'.

    Supponi di avere una struttura dati complicata a piacere: una matrice, una matrice di matrici, o qualunque cosa tu riesca ad immaginare.

    Ora, questa struttura dati la devi traferire, tale e quale, ad un'altro programma che sta' in un'altro computer collegato al primo attraverso un cavo (ad esempio Internet, che puoi pensare come un semplice cavo ma che in realta' e' infinitamente piu' complesso)

    Come fare, visto che sul cavo puo' passare SOLO un byte alla volta? Ovviamente dopo il primo byte ne puoi inviare un'altro e poi un'altro, e cosi' via... In SERIE

    Le operazioni di serializzazione/deserializzazione (vanno SEMPRE in coppia, ovviamente) sono delle operazione che vanno progettatate in modo tale da poter convertire la struttura dati in una SERIE di byte da inviare attraverso il cavo e, dall'altra parte, ricevere la SERIE di byte e ricostruire ESATTAMENTE la stessa struttura dati.

    Si procede per passi:
    1) si deve poter inviare tipi semplici (char, int, float,..
    2) si deve poter inviare vettori di tipi semplici
    3) si deve poter inviare strutture composte da tipi semplici
    4) si deve poter inviare vettori o strutture di tipi in formato 1,2,3,4

    Il 'casino' nasce con i puntatori che NON POSSONO essere traferiti, perche' NON ESISTE NESSUN MODO per assicurare che la struttura dati possa essere ricostruita nel computer di destinazione ESATTAMENTE allo stesso indirizzo di memoria. Quindi bisogna inventatsi dei trucvhi super trucchettosi per agirare la rogna rognosa. MA si puo' fare, ovviamente

    MA questa e' un'altra storia

    Tanto per generalizzare un po' il tuo esempio: hai serializzato/deserialuzzato una matrice 2x2.
    Ma se dovessi progettare la ser/deser per matrici di QUALUNQUE dimensione (3x3, 5x5, 20x20 o anche 6x8, 3x5,...) come potresti fare?
    Innanzitutto grazie mille per la spiegazione.
    Quindi se non ho capito male supponiamo che abbia una matrice di che ne so 20x20.
    Io dovrei scomporre ogni dato contenuto in un flusso non superiore ad 1 byte?
    Quindi convertire per esempio in binario puro, fossero numeri, al massimo un flusso di 8 bit per volta?
    Mettiamo che abbia un indice di matrice con valore decimale 128, dovrò scomporlo in due flussi da 8 bit a uno?
    Grazie ancora!!
    Buona giornata!
  • Re: Serializzazione Deserializzazione Matrice

    Il flusso E' uno!

    NON FARE casino tra "flusso" /"byte" e "bit!

    Pensa al nastro trasportatore che trasporta mattoni (tutti belli allineati!) :

    Il" flusso" e' la sequenza di mattoni trasportati dal nastro trasportatore! Il "mattone" e' UN byte.

    Non si lavora praticamente MAI a livello di bit.
    Quando capita di farlo, chi lo fa sa ESATTAMENTE che cosa sta' facendo!

    Se devi inviare una matrice 20x20 di float (32bit/4byte), devi inviare 400 float. Poiche' ogni float e' composto da 4 byte, devi inviare 4x400=1600 byte.

    Quindi, devi scomporre il float in 4 byte, quindi inviare i 4 byte per ogni float che devi inviare.

    MA come fa, chi riceve, a sapere che la matrice e' 20x20?

    Quindi devi inviare anche qualche altra informazione. Quale?

    Ecco, se non ti piace il "cavo", RAGIONA in termini di

    1) mattone (byte) e supponiamo che OGNI mattone abbia un colore diverso
    2) 4mattoni (float) PRE incollati tra di loro
    3) parete fatta di 4mattoni (matrice)

    Devi smontare la parete e rimontarlada ESATTAMENTE uguale da un'altra parte usando un nastro trasportatore per trasportare i SINGOLI mattoni!
  • Re: Serializzazione Deserializzazione Matrice

    migliorabile ha scritto:


    Il flusso E' uno!

    NON FARE casino tra "flusso" /"byte" e "bit!

    Pensa al nastro trasportatore che trasporta mattoni (tutti belli allineati!) :

    Il" flusso" e' la sequenza di mattoni trasportati dal nastro trasportatore! Il "mattone" e' UN byte.

    Non si lavora praticamente MAI a livello di bit.
    Quando capita di farlo, chi lo fa sa ESATTAMENTE che cosa sta' facendo!

    Se devi inviare una matrice 20x20 di float (32bit/4byte), devi inviare 400 float. Poiche' ogni float e' composto da 4 byte, devi inviare 4x400=1600 byte.

    Quindi, devi scomporre il float in 4 byte, quindi inviare i 4 byte per ogni float che devi inviare.

    MA come fa, chi riceve, a sapere che la matrice e' 20x20?

    Quindi devi inviare anche qualche altra informazione. Quale?

    Ecco, se non ti piace il "cavo", RAGIONA in termini di

    1) mattone (byte) e supponiamo che OGNI mattone abbia un colore diverso
    2) 4mattoni (float) PRE incollati tra di loro
    3) parete fatta di 4mattoni (matrice)

    Devi smontare la parete e rimontarlada ESATTAMENTE uguale da un'altra parte usando un nastro trasportatore per trasportare i SINGOLI mattoni!
    OK, inizio a capire credo.
    Provo a renderla banale:
    se ho un testo di 60 caratteri dovrò mandare 60 mattoni, uno dietro l'altro, attraverso il mio nastro.
    Supponendo che sia corretto, immagino che debba inviare anche le specifiche di quello che sto inviando, giusto?
    Quindi trovare un modo per dire che sono caratteri, far sapere quanti byte invierò e forse anche un fine pacchetto?

  • Re: Serializzazione Deserializzazione Matrice

    0) NON SERVE RI-QUOTARE tutto il messaggio precedente!
    AL limite quoti la frase per fare il punto, altrimenti NON SERVE: il messaggio e' gia' li e lo puo' leggere chiunque!

    Quasi esattamente.

    "Quasi" perche', in generale, chi riceve la struttura dati SA GIA' che cosa sta' ricevendo, ma non necessariamente i dettagli piu' spiccioli (che COMUNQUE SONO STRA-NECESSARI per ricostruire ESATTAMENTE la struttura dati).

    Se devi inviare 60 caratteri, chi riceve SA che ricevera' dei caratteri ma NON NECESSARIAMENTE che saranno 60
    Se devi inviare una matrice 20x20, chi riceve SA che deve ricevere una matrice ma NON NECESSARIAMENTE che debba essere PROPRIO 20x20.

    Puoi immagnare almeno 3 livelli di "astrazione":

    1) chi riceve SA ESATTAMENTE che cosa deve ricevere, fin nei minimi dettagli (ESATTAMENTE la matrice 20x20, ESATTAMENTE 60 caratteri)
    2) chi riceve SA che cosa deve ricevere, MA NON i dettagli spiccioli (SA che riceve una matrice ma non le dimensioni, SA che riceve una sequenza di caratteri ma non il numeroi)
    3) chi riceve NON HA IDEA di che cosa ricevera', quindi, quando si invia qualcosa si deve descrivere NEL DETTAGLIO che cosa si sta' inviando: il tipo di struttura dati, il tipo di dato, il valore, ...

    Di volta in volta si scegliera' uno dei possibili approcci.

    Nel 90% dei casi ci si trova nella situazione 2 (sufficientemente flessibile e sufficientemente efficiente perche' non serve inviare troppe informazioni aggiuntive)

    Praticamente MAI ci si trova nella situazione 1, perche' la 2 puo' essere usata anche per la 1 con un microscopico overhead.
    Raramente ci si trova nella situazione 3. Raramente NON VUOL DIRE MAI!

    Quello che si fa e':

    1) inviare un'INTESTAZIONE con le informaazioni sulle DIMENSIONI della struttura dati (e magari un numero di versione, ma questa e' un'altra storia)
    2) inviare i dati
    3) inviare un TERMINATORE che contiene, tra l'altro, una FIRMA di qualche genere che dipende dai dati inviati

    Chi riceve

    1) riceve l'INTESTAZIONE da cui estrae la DIMENSIONE della struttura dati e la usa per creare, IN LOCALE, una struttura dati VUOTA ma con le stesse dimensioni
    2) riceve i DATI che usa per popolare la struttura dati
    3) riceve il TERMINATORE con la firma, calcola la firma sui dati ricevuti e CONTROLLA se le due firme sono uguali

    Il passo 3 e' NECESSARIO per ASSICURARSI di aver ricevuto TUTTO NEL MODO ESATTO: se le due FIRME sono diverse, c'e' qualcosa che non va!
    Dove sia il problema e', OVVIAMENTE, una questione che andra' analizzata: puo' essere a livello di invio O di ricezione OPPURE nel canale di trasmissione!
  • Re: Serializzazione Deserializzazione Matrice

    0) NON SERVE RI-QUOTARE tutto il messaggio precedente!
    Afferrato! scusate
    Quello che si fa e':
    ...
    Grazie Mille!! davvero!

    Buona giornata!
  • Re: Serializzazione Deserializzazione Matrice

    Comunque per le matrici il concetto di serializzazione, Almeno secondo me, non è molto utile. Infatti tutti gli elementi degli array bidimensionali sono tra di loro contigui, così come lo sono quelli di un array monodimensionale. Il discorso acquista significato, e complicazioni, se si parla di liste o di variabili comunque distinte, per le quali non esiste garanzia che siano contigue.
  • Re: Serializzazione Deserializzazione Matrice

    silente ha scritto:


    Comunque per le matrici il concetto di serializzazione
    Hai Ragione, studiando e progredendo me ne sono accorto anche io.
    Credo fosse esclusivamente un esercizio per consolidare il concetto di funzioni richiamate all'occorrenza nel main.

Devi accedere o registrarti per scrivere nel forum
9 risposte