我的应用程序设置为通过网络发送对象,通过在发送端将它们序列化为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然后将其传递给反序列化器?
答案 0 :(得分:1)
请参阅:Deserializing data sent via TCP
答案表明,当读取最后一个字节时,NetworkStream不会通知。因此,似乎您的deserlializer一直试图从NetworkStream尝试读取(即使在到达结束之后;因为NetworkStream不通知它),因此导致异常。您需要阅读MemoryStream。
答案 1 :(得分:0)
您如何知道何时收到整个XML文件?只要远程端未关闭连接,调用Read
(XmlSerializer
将执行此操作)将阻止并等待数据。