Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Serializzazione di oggetti

Ciao a tutti, tranne il solito.
Ho qualche dubbio sulla serializzazione e memorizzazione su file di un
oggetto collection class.
I dettagli sono questi: devo salvare su disco un numero indefinito di
oggetti che sono di una stessa classe (una collection class), ma non
hanno la stessa dimensione. Ci sono una dozzina di tipi diversi di
istanze con, appunto, un numero variabile di items, che dipende da come
l'oggetto viene inizializzato. Ad esempio, supponiamo di avere una
classe Pettine, che contiene al suo interno un numero variabile di
istanze della classe Punte, dipendente dalla proprietà Lunghezza. A me
interessa creare un file (niente ADO e soci) per salvare su disco
parecchi esemplari di pettine.
Io ho pensato di aggiungere alla classe Pettine una proprietà DataStream
As String in cui codifico il primo chr come tipologia di pettine e nel
resto della stringa accodo i valori relativi a ogni singola istanza di
Punta.
Potrei  a questo punto salvare in un file sequenziale tutte le stringhe
DataStream (che non hanno la stessa dimensione, ma ho sempre il byte
della tipologia che mi definisce la lunghezza del record. La Property
Let  DataStream mi permetterebbe di assegnare all'istanza di Pettine i
dati sulle Punte contenuti nel DataStream.
Troppo arcaico e contorto? C'è qualche alternativa più elegante e
funzionale?
Grazie
Flavio Ronco
--
f.ronco@*NonMiServeNiente*
flashnet.it
http://www.metabrains.com
  [Under Construction]
-------------------------------------------------------------
"Che pubblico in gamba! Se ci dite dove lavorate,
domani mattina se abbiamo tempo vi veniamo a vedere"
[Paolo Rossi]


No, non mi sembra arcaico e contorto (ho usato un sistema
simile per un mio progetto e funziona benone).
Magari potresi definire il metodo DataStream anche per gli
oggetti Punte e definire le punte del pettine come Collection,
così il codice per serializzare il pettine è
<in class Pettine>
private collPunte as Collection
...
public Sub DataStream
    dim p as Punte
    print #outputfile, <qualcosa>
    for each p in  collPunte
        p.DataStream
    next
end sub
(non ho provato il codice, ma l'idea è questa...)
Buon lavoro, Massimo.


Mi sembra ok. (anche Delphi ha un meccanismo simile, anche se piu' OOP, con
metodi SaveToStream e LoadFromStream).
Magari, piu' semplicemente, invece del byte "tipo_di_pettine" potresti
salvare direttamente la dimensione in bytes della struttura (N.B. e' la
stessa tecnica usata per le strutture complesse _potenzialmente variabili_
passate come parametri alle funzioni API di Windows, in genere il primo
campo e' la dimensione in byte della struttura).
--
Roal Zanazzi
z...@iol.it

 
z...@iol.it
Grazie per l'aiuto, non avevo letto finora le vostre risposte. Puntualizzerei
solo una cosa:  la lunghezza mi servirebbe di meno, rispetto alla tipologia di
Punta. Infatti, dal dataStream devo ricreare la Punta del tipo giusto, e questo
potrebbe non dipendere solo dalla lunghezza. Ho realizzato il tutto e funziona.
Il file č di tipo Binary, e ho utilizzato tipi definiti dall'utente contenenti
array dinamici di bytes e stringhe a lunghezza variabile. Vengono letti e
scritti correttamente dalle istruzioni Get# e Put#.
