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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top