2009-07-24 5 views
2

Я прав, что сериализация сложных типов еще не реализована в Mono 2.4.2 или я допустил ошибку?Ошибка чтения типа Npgsql (было: mono не сериализует сложные типы)

Когда я называю функцию удаленной, я получаю сообщение об ошибке:

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.

В общем, если вы разрабатываете приложение, которое будет работать в различных средах и платформах, которые не под вашим контролем, и которые нужно разделить сериализованные объекты (либо с помощью Remoting, обычные файлы, или независимо от того), вы должны быть осторожны с объектами, которыми вы делите, и избегать объектов из рамки, когда возможно .

(Обратите внимание, что это относится только к сериализаторов на основе System.Runtime.Serialization рамки, и не относится к XmlSerializer).

Однако он не работает даже между моно-2.4.2 и другим моно-2.4.2-приложением.

+0

Кажется, проблема не в сериализации, а в классе чтения Npgsql, GetString() или что-то еще. –

ответ

1

Проблема в Npgsql, поэтому я изменяю заголовок. Эти две линии должны быть эквивалентны Я думаю, оба должны возвращать string но первый не работает:

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

Для отладки еще сложнее, .NET Remoting передает ошибку в вызывающей стороны.

0

.net сериализация не делает дженерики ... еще ... grrrrr.

Моно может быть сложным, но как .net 2.0, строка [] должна работать. Конечно, попробуйте свой код в окнах.

 Смежные вопросы

  • Нет связанных вопросов^_^