複合型のシリアル化が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アプリケーションの間でも機能しません。