Npgsql reader类型转换错误(是:mono不能很好地序列化复杂类型)

时间:2009-07-24 06:12:13

标签: .net mono remoting npgsql

我是否认为序列化复杂类型尚未在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应用程序之间工作。

2 个答案:

答案 0 :(得分:1)

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

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

为了使调试更加困难,.net远程处理将错误传递给调用方。

答案 1 :(得分:0)

.net序列化不做泛型......但是...... grrrrr。

单声道可能很棘手,但从.net 2.0开始,string []应该可行。当然,请在Windows上试用您的代码。

相关问题