Serializzare oggetti in processi diversi

mercoledì 16 marzo 2005 - 13.16

ffederico Profilo | Newbie

Ho un problema che non riesco in nessun modo a risolvere.
La situazione e' questa:

Ho una classe A che implementa un'interfaccia IA.

[Serializable]
public class A : IA {
}

Ho poi diverse altre classi che derivano da A. es:

[Serializable]
public class B : A {
}
[Serializable]
public class C : A {
}

Inserisco le classi in una hastable:

ht.Add( "1",b1 );
ht.Add( "2",c2 );
...

dove b1, c2 ecc sono classi derivate da A.

Serializzo l'hashtable in memoria e mi ritorna un array di byte: byte[] buffer.

byte[] buffer = serializza( ht );

I byte letti li passo alla funzione deserializza che mi ritorna un oggetto generico (Object) che casto al tipo hashtable:

System.Collection.Hashtable myht =
(System.Collection.Hashtable)deserializza(buffer);

Dichiaro una variabile di tipo A

A rec;

e la utilizzo normalmente

System.Collections.IDictionaryEnumerator e = myht.GetEnumerator();
while( e.MoveNext() ) {
if( null != e.Value ) {
rec = (A)e.Value; // !!!!!!!
}
}

In questo modo funziona tutto. Riesco ad utilizzare rec come se fosse un oggetto di tipo B o C senza problemi.

Provo a salvare il buffer in un file su disco. Chiudo l'applicaizone e la riapro leggendomi i lfile, e comunque riesco a ricaricare l'hashtable ed a utilizzarle gli oggetti in essa contenuti allo stesso modo e senza errori.

Il problema:
lo STESSO IDENTICO codice (con chiaramente le STESSE IDENTICHE classi A, IA, B e C ) se lo utilizzo in un'altro eseguibile, diverso dall'eseguibile che ha scritto il file su disco, non mi permette di castare rec ad un tipo di classe A dicendomi che il cast non e' possibile.

La cosa strana e' che il debugger invece, visualizza correttamente gli oggetti e.value (se semplicemente li faccio scorrere). Non solo. Ma se assegno l'oggetto e.value ad una variabile tipo object me lo fa fare senza problemi, e la variabile oggetto generico, sempre nel debugger, visualizza correttamente il suo contenuto che e' esattamente quello della classe A, B o C.

Com'e' possibile questa cosa?

ffederico Profilo | Newbie

Trovato l'inghippo.

Lo trascrivo così che qualcuno se ne ha bisogno non perda tutto il tempo che ho perso io.

Non era un problema di file ne di codice. Il problema risiede nel fatto che le classi, se utilizzate in due progetti diversi, è come se avessero un id di riconoscimento diverso. Non scendo nel dettaglio che comunque non ho approfondito (se qualcuno ne sa di più sarebbe interessante).

Per cui, per comunicare tra due applicazioni con oggetti serializzati, ho risolto inserendo gli oggetti comuni che volevo serializzare, in una dll esterna.
La dll, essendo la stessa inclusa nei due progetti, è riconoscibile da entrambi.

Così mi funziona tutto correttamente.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5