2

複合型のシリアル化がMono2.4.2でまだ実装されていないのは正しいですか、それとも間違いを犯しましたか?

リモート関数を呼び出すと、次のエラーメッセージが表示されます。

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]

これはリモート機能です。string[] 代わり に使用しても同じ結果が得 られました。stringうまくいきます。

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;
}

呼び出し側:

List<string> w = remoteClass.GetHist();
foreach (string s in w)
    Console.Write(s + ", ");
Console.WriteLine();

私はこれをhttp://mono-project.com/FAQ:_Technicalで見つけました:

シリアル化の互換性はどうですか?オブジェクトをMonoでシリアル化し、MS.NETで逆シリアル化することはできますか、またはその逆はできますか?

Monoに実装されているシリアル化形式は、MS.NETのシリアル化形式と完全に互換性があります。ただし、互換性のある形式を持つだけでは十分ではありません。シリアル化されたオブジェクトを正常に交換するには、対応するクラスが両側で同じ内部構造(つまり、同じパブリックフィールドとプライベートフィールド)を持っている必要があります。

独自のクラスをシリアル化する場合は、シリアル化に使用されるアセンブリとクラスを制御できるため、問題はありません。

ただし、フレームワークからオブジェクトをシリアル化する場合、それらのオブジェクトの内部構造が異なる可能性があるため、シリアル化の互換性は保証されません。この互換性は、異なるMS.NETバージョンまたはMonoバージョン間でも保証されません。

私たちのポリシーは、フレームワーククラスをMonoとMS.NETの間で互換性があるようにするために最善を尽くすことですが、内部実装があまりにも異なるため、これが不可能な場合があります。クラスを変更してMS.NETと互換性を持たせると、古いバージョンのMonoとの互換性が失われることにも注意してください。

要約すると、制御下にないさまざまな環境やプラットフォームで実行され、シリアル化されたオブジェクトを共有する必要があるアプリケーションを設計している場合(リモート処理、プレーンファイルなどを使用)、どのオブジェクトに注意する必要があります共有し、可能な場合はフレームワークからのオブジェクトを避けます。

(これは、System.Runtime.Serializationフレームワークに基づくシリアライザーにのみ適用され、XmlSerializerには適用されないことに注意してください)。

ただし、mono-2.4.2と別のmono-2.4.2アプリケーションの間でも機能しません。

4

2 に答える 2

1

問題は Npgsql にあるため、タイトルを変更します。これらの 2 行は同等である必要があり、どちらも a を返す必要がありますstringが、最初の行は機能しません。

dr.GetString(i)
dr[i].ToString()

デバッグをさらに難しくするために、.net リモート処理はエラーを呼び出し側に渡しました。

于 2009-07-24T09:52:23.943 に答える
0

.net シリアライゼーションはジェネリックを行いません...まだ...grrrrr。

Mono は扱いにくい場合がありますが、.net 2.0 では string[] が機能するはずです。確かに、Windows でコードを試してみてください。

于 2009-07-24T07:24:18.610 に答える