У меня есть связь между главным сервером и подчиненными серверами. Я хочу в главном сообщении 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;
}
Я нашел этот пример после много поиска. Спасибо, совет. :)
Вы хотите добавить 3 дополнительных байтов в ваших сериализованными данных. Итак, чтобы десериализовать ваши данные правильно, используйте MemoryStream без этих байтов, например. 'new MemoryStream (data, 3, data.Length - 3)' – nkj
Как его добавить в код? Могу ли я получить от вас помощь? Я не совсем понимаю, что стоит за этим кодом. – SOFProjectector