2015-04-28 5 views
0

Я пишу клиент-серверное приложение. Я хочу отправить DataTable table, где большинство столбцов имеют тип Pair. У меня есть public class Pair внутри public class Struct как на сервере, так и на клиенте.Исключение при десериализации DataTable с настраиваемыми столбцами DataType с использованием BinaryFormatter

[Serializable] 
public class Struct 
{ 
    public class Pair 
    { 
     public int a { get; set; } 
     public int b { get; set; } 
      ... 
     public override string ToString() 
     { 
      return this.a.ToString() + " " + this.b.ToString(); 
     } 
    } 
     ... 
} 

Я посылаю его с сервера:

(new BinaryFormatter()).Serialize(nStream, table); 

Accept на клиенте:

DataTable table = (DataTable)(new BinaryFormatter()).Deserialize(nStream); 

И здесь я получаю TargetInvocationException Exception

»была брошенная цель вызова "с InnerException: ArgumentException «Столбец требует действительного типа данных».

Как отправить эту таблицу по сети и десериализировать ее?

ответ

0

Вы должны отметить внутренний класс как [Serializable] также:

[Serializable] 
public class Struct 
{ 
    [Serializable] 
    public class Pair 
    { 
     public int a { get; set; } 
     public int b { get; set; } 
    } 
} 

Вложенный класс не является подклассом, что это independent type, что происходит, чтобы иметь доступ к защищенным и закрытым членам содержащего его типа.

Кроме того, вы на самом деле связывающая же assembly, который содержит ваш Struct в клиенте и сервере, или вы просто скопировать код? BinaryFormatter фактически записывает имя сборки и версию сериализуемых типов и если после десериализации эта конкретная сборка не найдена, десериализация завершится неудачно. См. How to serialize/deserialize an object loaded from another assembly?