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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top