Npgsql tipo lettore di errore cast (era: mono non serializza ben tipi complessi)
Domanda
Ho ragione che la serializzazione di tipi complessi non è implementata in Mono 2.4.2 ancora, o ti ho fatto un errore?
Quando chiamo la mia funzione remota, ricevo un messaggio di errore:
Cannot cast from source type to destination type.
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke
(System.Runtime.Remoting.Proxies.RealProxy rp, IMessage msg,
System.Exception& exc, System.Object[]& out_args) [0x00000]
Questa è la funzione remota.
Ho avuto lo stesso risultato quando uso string[]
invece.
string
fa strada attraverso bene.
public List<string> GetHist()
{
NpgsqlConnection conn = new NpgsqlConnection(ConnectStr);
conn.Open();
string cmd = "select * from history";
NpgsqlCommand command = new NpgsqlCommand(cmd, conn);
List<string> s = new List<string>();
try
{
NpgsqlDataReader dr = command.ExecuteReader();
if (dr.Read())
{
for (int i = 0; i < dr.FieldCount; i++)
s.Add(dr.GetString(i));
}
else
s.Add("(hehe)");
}
finally
{
conn.Close();
}
return s;
}
Il chiamante:
List<string> w = remoteClass.GetHist();
foreach (string s in w)
Console.Write(s + ", ");
Console.WriteLine();
Ho trovato questo a http://mono-project.com/FAQ:_Technical :
Che dire di compatibilità serializzazione? Posso serializzare un opporsi in mono e deserializzare in MS.NET o viceversa?
Il formato di serializzazione implementato in Mono è pienamente compatibile con quello di MS.NET. Tuttavia, avendo un formato compatibile non è sufficiente. Nel per uno scambio di successo oggetti serializzati, il corrispondente classi devono avere lo stesso interno struttura (cioè, lo stesso pubblico e campi privati) in entrambi i lati.
Se si serializzare il proprio classi, non c'è nessun problema, dal momento che si ha il controllo delle assemblee e classi utilizzati per serializzazione.
Tuttavia, se si sta serializzazione oggetti dal quadro, compatibilità serializzazione non è garantito, in quanto il interno struttura di tali oggetti può essere diverso. Questa compatibilità non è anche garantito tra diversi versioni MS.NET o le versioni mono.
La nostra politica è di fare del nostro meglio per rendere le classi del framework compatibili tra Mono e MS.NET, tuttavia a volte questo non è possibile perché l'implementazione interna è troppo diverso. Si noti inoltre che quando ci cambiare una classe per renderlo compatibile con MS.NET, perdiamo la compatibilità con le versioni precedenti di Mono.
In sintesi, se si sta progettando un applicazione che verrà eseguito in diversi ambienti e piattaforme che sono non sotto il vostro controllo, e che necessità per condividere oggetti serializzati (sia utilizzando i servizi remoti, file normali, o qualunque cosa), si deve stare attenti con Quali oggetti si condivide, ed evitare oggetti dal quadro quando possibile.
(Si noti che questo vale solo per serializzatori sulla base del System.Runtime.Serialization quadro, e non si applica al XmlSerializer).
Tuttavia, non anche il lavoro tra mono-2.4.2 e un'altra applicazione mono-2.4.2.
Soluzione
Il problema è in Npgsql così a cambiare il titolo.
Queste due linee dovrebbero essere equivalenti Penso, entrambi dovrebbero restituire un string
ma il primo non funziona:
dr.GetString(i)
dr[i].ToString()
Per rendere ancora più difficile il debug, i servizi remoti .NET passa l'errore al lato chiamante.
Altri suggerimenti
.net serializzazione non fa farmaci generici ... eppure ... grrrrr.
Mono può essere difficile, ma come di .net 2.0, string [] dovrebbe funzionare. A dire il vero, provare il codice su Windows.