我有服务器和客户端应用程序,它们通过 NetworkStream 进行通信。在服务器上,我二进制序列化一个对象并通过 NetworkStream 发送它,它在客户端上读取并反序列化。但它会抛出错误:二进制流“0”不包含有效的 BinaryHeader。可能的原因是无效的流或序列化和反序列化之间的对象版本更改。首先我检查了 NetworkStream 的长度,在发送序列化对象后,服务器和客户端上的长度是一样的。然后我添加一个对客户端的服务器引用并使用 Server.SaveData 来确保我在反序列化时具有完全相同的类。
然后我尝试序列化和反序列化服务器上的相同对象,下面的代码完美运行。
stream.Read(buffer, 0, total);
network_stream.Write(buffer, 0, total);
network_stream.Read(buffer, 0, total);
stream.Position = 0;
stream.Write(buffer, 0, total);
SaveData savedata = (SaveData)formatter.Deserialize(stream);
这是来自服务器的完整代码:
Stream stream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
current_state.saveData(map, red, blu);
formatter.Serialize(stream, current_state);
int total = (int)stream.Length;
byte[] buffer = new byte[total];
writer.WriteLine(total.ToString());
writer.Flush();
stream.Read(buffer, 0, total);
network_stream.Write(buffer, 0, total);
stream.Close();
和客户端:
Stream stream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
while (reader.Peek() == '\0') { reader.Read(); } //solved the problem, idkw
int total = Convert.ToInt32(reader.ReadLine().ToString());
byte[] buffer = new byte[total];
network_stream.Read(buffer, 0, total);
stream.Position = 0;
stream.Write(buffer, 0, total);
stream.Position = 0;
Console.Write(stream.Length.ToString());
Server.SaveData current_state = (Server.SaveData)formatter.Deserialize(stream); //here is the problem
stream.Close();