我对 Mono 2.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 应用程序之间工作。