2014-11-23 2 views
0

У меня есть связь между главным сервером и подчиненными серверами. Я хочу в главном сообщении Serialize и в подчиненном устройстве десериализовать его как объект. Так что я пытался сделать это, и я получил исключение:Как десериализовать байты, которые я отправил?

The input stream is not a valid binary format. The starting contents (in bytes) are: 03-00-01-3F-C3-F5-E4-41-00-C0-8D-C3-14-EE-4A-C3-00 ... 

Я отмеченную в коде, где он попадает в десериализации.

Я хочу, чтобы мое сообщение выглядеть следующим образом: ID сообщения (например, 1 \ 2 \ 3) + OBJ:

----------------------------- 
| ID | OBJECT    | 
----------------------------- 

Мой код:

public override byte[] Serialize() 
     { 
      byte[] byteToSend = new byte[1024]; 
      MemoryStream stream = new MemoryStream(); 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 
      formatter.Serialize(stream, this); 
      byteToSend[0] = 3; 
      Array.Copy(stream.ToArray(), 0, byteToSend, 3, stream.ToArray().Length); 
      return byteToSend; 
     } 

     internal sealed class VersionConfigToNamespaceAssemblyObjectBinder : SerializationBinder 
     { 
      public override Type BindToType(string assemblyName, string typeName) 
      { 
       Type typeToDeserialize = null; 
       try 
       { 
        string ToAssemblyName = assemblyName.Split(',')[0]; 
        Assembly[] Assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
        foreach (Assembly ass in Assemblies) 
        { 
         if (ass.FullName.Split(',')[0] == ToAssemblyName) 
         { 
          typeToDeserialize = ass.GetType(typeName); 
          break; 
         } 
        } 
       } 
       catch (System.Exception exception) 
       { 
        throw exception; 
       } 
       return typeToDeserialize; 
      } 
     } 

     public override BaseMassage DeSerialize(byte[] data) 
     { 
      MemoryStream stream = new MemoryStream(data); 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 
      formatter.Binder = new VersionConfigToNamespaceAssemblyObjectBinder(); 
      RadarMassage obj = (RadarMassage)formatter.Deserialize(stream); // ---- Here it falls 
      return obj; 
} 

Я нашел этот пример после много поиска. Спасибо, совет. :)

+1

Вы хотите добавить 3 дополнительных байтов в ваших сериализованными данных. Итак, чтобы десериализовать ваши данные правильно, используйте MemoryStream без этих байтов, например. 'new MemoryStream (data, 3, data.Length - 3)' – nkj

+0

Как его добавить в код? Могу ли я получить от вас помощь? Я не совсем понимаю, что стоит за этим кодом. – SOFProjectector

ответ

0

Попробуйте этот код

public override BaseMassage DeSerialize(byte[] data) 
{ 
     MemoryStream stream = new MemoryStream(data, 3, data.Length - 3); 
     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 
     formatter.Binder = new VersionConfigToNamespaceAssemblyObjectBinder(); 
     RadarMassage obj = (RadarMassage)formatter.Deserialize(stream); 
     return obj; 
} 
+0

Как волшебство :) Это работает, но как я могу узнать, что объект читается правильно? – SOFProjectector

+0

Он всегда отправляет один и тот же массив байтов. Почему так происходит ? – SOFProjectector

+0

Если данные были десериализованы в объект без исключения, он «читается правильно». Если объект не изменяется, вы получите тот же массив данных – nkj