Npgsql Lesertyp Gussfehler (war: mono nicht serialisiert nicht komplexe Typen gut)
Frage
Bin ich richtig, dass komplexe Typen Serialisierung nicht in Mono 2.4.2 noch implementiert ist, oder haben wir einen Fehler gemacht?
Wenn ich meine Remote-Funktion aufrufen, erhalte ich eine Fehlermeldung:
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]
Dies ist die Remote-Funktion.
Ich habe das gleiche Ergebnis, wenn ich string[]
stattdessen verwenden.
string
macht seinen Weg durch gut.
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;
}
Der Anrufer:
List<string> w = remoteClass.GetHist();
foreach (string s in w)
Console.Write(s + ", ");
Console.WriteLine();
Ich fand dies unter http://mono-project.com/FAQ:_Technical :
Was ist die Serialisierung Kompatibilität? Kann ich eine Serialisierung Objekt in Mono und deserialisieren es in MS.NET oder umgekehrt?
Das Serialisierungsformat implementiert in Mono ist voll kompatibel mit demjenigen von MS.NET. Jedoch mit einem kompatibles Format ist nicht genug. Im Um erfolgreich auszutauschen serialisierte Objekte, die entsprechend Klassen müssen die gleiche interne haben Struktur (das heißt, der gleiche öffentliche und private Felder) in beiden Seiten.
Wenn Sie eine eigene serialisieren Klassen, gibt es kein Problem, da Sie haben die Kontrolle über die Baugruppen und Klassen verwendet werden, für Serialisierung.
Wenn Sie jedoch sind die Serialisierung Objekte aus dem Rahmen, Serialisierung Kompatibilität ist nicht gewährleistet, da die internen Struktur dieser Objekte können anders. Diese Kompatibilität ist nicht sogar zwischen verschiedenen garantiert MS.NET Versionen oder Mono-Versionen.
Unsere Politik ist es, unser Bestes zu tun, um die Framework-Klassen kompatibel zwischen Mono und MS.NET jedoch manchmal ist dies nicht möglich, weil die interne Implementierung ist zu anders. Beachten Sie auch, dass, wenn wir eine Klasse ändern, um es kompatibel mit MS.NET, verlieren wir die Kompatibilität mit älteren Versionen von Mono.
Zusammenfassend: Wenn Sie entwerfen ein Anwendung, die in verschiedenen läuft Umgebungen und Plattformen, die sind nicht unter Kontrolle, und dem Bedürfnis serialisierte Objekte zu teilen (entweder mit Remote, einfache Dateien oder was auch immer), müssen Sie vorsichtig sein mit was Objekte teilen Sie und vermeiden Objekte aus dem Rahmen, wenn möglich.
(Beachten Sie, dass dies nur für Serializer auf der Grundlage der System.Runtime.Serialization Rahmen und gilt nicht für die XmlSerializer).
Allerdings ist es nicht einmal arbeitet zwischen mono-2.4.2 und anderen Mono-2.4.2-Anwendung.
Lösung
Das Problem ist in Npgsql so dass ich den Titel ändern.
Diese beiden Linien sollten gleichwertig sein denke ich, die beide eine string
zurückkehren sollte aber der erste nicht funktioniert:
dr.GetString(i)
dr[i].ToString()
Um das Debuggen noch schwieriger zu machen, .net remoting den Fehler an den Aufrufer Seite übergeben.
Andere Tipps
.net Serialisierung Generika nicht tun ... noch ... grrrrr.
Mono kann schwierig sein, aber wie von .net 2.0, string [] sollte funktionieren. Um sicher zu sein, versuchen Sie Ihren Code auf Windows.