我使用ProtoBuf-Net对TCP_Messages进行序列化和反序列化。
我已经尝试了我在这里找到的所有建议,所以我真的不知道错误在哪里。
序列化是服务器端,反序列化是在应用程序客户端进行的。
序列化代码:
public void MssGetCardPersonalInfo(out RCPersonalInfoRecord ssPersonalInfoObject, out bool ssResult) {
ssPersonalInfoObject = new RCPersonalInfoRecord(null);
TCP_Message msg = new TCP_Message(MessageTypes.GetCardPersonalInfo);
MemoryStream ms = new MemoryStream();
ProtoBuf.Serializer.Serialize(ms, msg);
_tcp_Client.Send(ms.ToArray());
_waitToReadCard.Start();
_stopWaitHandle.WaitOne();
反序列化:
private void tpcServer_OnDataReceived(Object sender, byte[] data, TCPServer.StateObject clientState)
{
TCP_Message message = new TCP_Message();
MemoryStream ms = new MemoryStream(data);
try
{
//ms.ToArray();
//ms.GetBuffer();
//ms.Position = 0;
ms.Seek(0, SeekOrigin.Begin);
message = Serializer.Deserialize<TCP_Message>(ms);
} catch (Exception ex)
{
EventLog.WriteEntry(_logSource, "Error deserializing: " + ex.Message, EventLogEntryType.Error, 103);
}
正如你所看到的,我已尝试了一系列不同的方法,现在已经发表了评论。
我也尝试使用DeserializeWithLengthPrefix进行反序列化,但它也没有用。
我对此有点像菜鸟,所以如果你能帮助我,我会非常感激。
感谢&#39; S
答案 0 :(得分:0)
首先要看的是:是您收到所发送数据的数据。直到你能回答&#34;是&#34;对此,所有其他问题都没有实际意义。 非常容易混淆网络代码并最终读取部分帧等。作为原始调试器测试:
Debug.WriteLine(Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length));
应该有效。如果两个base-64字符串不相同,那么您不能使用相同的数据。这可能是由于一系列原因,包括分组分组和组合。您需要记住,在流中,您发送的内容不是您获得的内容 - 至少,不是片段级别。你可能会发送&#34;数据的方式:
但在接收端,阅读完全合法:
所有TCP保证都是字节的顺序和准确度。它说没什么关于他们在块上的细分。编写网络代码时,基本上有两种方法: