我将我的应用程序设置为通过网络发送对象,方法是在发送端将它们序列化为 XML,并在接收端反序列化它们。我首先使用 UDP 设置它,效果很好。像这样的代码:
发件人:
MemoryStream ms = new MemoryStream();
dataSerializer.Serialize(ms, dataToSend, serNamespaceRemover);
senderClient.Send(ms.GetBuffer(), (int)ms.Length);
接收者:
IPEndPoint beaconEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), SharedData.udpPort);
byte[] receiveData = beaconClient.Receive(ref beaconEndpoint);
MemoryStream ms = new MemoryStream(receiveData);
CommData recieved = dataDeserializer.Deserialize(ms) as CommData;
现在我必须将其切换为使用 TCP。发件人似乎工作正常,而且非常简单:
dataSerializer.Serialize(senderClient.GetStream(), dataToSend, serNamespaceRemover);
但是我的接收器有问题。我尝试了简单而明显的事情:
NetworkStream netstr = client.GetStream();
CommData data = dataDeserializer.Deserialize(netstr) as CommData;
我得到了异常:XML 文档中存在错误 (5, 14)。XML 看起来像这样:
<?xml version="1.0"?>
<CommData>
<RigName>Rig 100</RigName>
<IsShutDown>false</IsShutDown>
</CommData>
所以 5,14 位置是接收数据结束后的 2 个字符。我将数据读入一个 char 数组,并确认右括号结束后没有任何内容,所以我不确定反序列化器在说什么。
同时,如果我这样做,那么接收器可以工作:
NetworkStream netstr = client.GetStream();
byte[] arry = new byte[client.Available];
netstr.Read(arry, 0, client.Available);
MemoryStream ms = new MemoryStream(arry);
CommData data = dataDeserializer.Deserialize(ms) as CommData;
这似乎很疯狂。为什么不能直接从 NetworkStream 中读取?我真的必须将数据读入 MemoryStream 然后将其传递给反序列化器吗?