.net Npgsql读取器类型转换错误(was:mono无法很好地序列化复杂类型)

.net Npgsql读取器类型转换错误(was:mono无法很好地序列化复杂类型),.net,mono,remoting,npgsql,.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

在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[]
时,得到了相同的结果。
字符串
顺利通过

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;
}
public List GetHist()
{
NpgsqlConnection conn=新的NpgsqlConnection(ConnectStr);
conn.Open();
string cmd=“从历史中选择*”;
NpgsqlCommand=新的NpgsqlCommand(cmd,conn);
列表s=新列表();
尝试
{
NpgsqlDataReader dr=command.ExecuteReader();
if(dr.Read())
{
对于(int i=0;i
呼叫者:

List<string> w = remoteClass.GetHist();
foreach (string s in w)
    Console.Write(s + ", ");
Console.WriteLine();
List w=remoteClass.GetHist();
foreach(w中的字符串s)
控制台。写入(s+“,”);
Console.WriteLine();
我在以下网站上找到:

序列化兼容性如何?我可以序列化一个 对象,并在 MS.NET或反之亦然?

实现的序列化格式 在单声道中,它与之完全兼容 NET的。但是, 兼容的格式是不够的。在里面 为了成功交换 序列化对象,对应的 类需要具有相同的内部 结构(即,相同的公共 和私人领域)在双方

如果您正在序列化自己的 上课,没有问题,因为 您可以控制程序集 以及用于 序列化

但是,如果您正在序列化 框架中的对象, 序列化兼容性不受限制 保证,因为内部 这些对象的结构可能是 不一样。这种兼容性不是很好 即使在不同的 MS.NET版本或Mono版本

我们的政策是尽最大努力 框架类是兼容的 然而,在Mono和MS.NET之间 有时这是不可能的,因为 内部实现过于复杂 不一样。还要注意,当我们 更改类以使其兼容 有了MS.NET,我们就失去了兼容性 使用旧版本的Mono

总之,如果您正在设计 将在不同环境中运行的应用程序 环境和平台 不在你的控制之下,你需要什么 共享序列化对象(或 使用远程处理、普通文件或 不管怎样),你必须小心 您共享和避免哪些对象 当 可能

(请注意,这仅适用于 基于 System.Runtime.Serialization 框架,并且不适用于 XmlSerializer)


但是,它甚至不能在mono-2.4.2和另一个mono-2.4.2应用程序之间工作。

.net序列化不做泛型…但…grrrrrr


Mono可能很棘手,但从.NET2.0开始,字符串[]应该可以工作。当然,请在windows上尝试您的代码。

问题出在Npgsql中,因此我更改了标题。 我认为这两行应该是等价的,它们都应该返回一个
字符串
,但第一行不起作用:

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

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

问题似乎不在于序列化,而在于Npgsql读取器类、GetString()或其他什么。