2

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

4

2 回答 2

1

问题出在 Npgsql 中,所以我更改了标题。我认为这两行应该是等价的,都应该返回 astring但第一行不起作用:

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 回答