내 응용 프로그램이 XML을 송신 측에 직렬화하고 수신 측에서 직렬화하여 네트워크를 통해 객체를 보내도록 설정했습니다. 우선 UDP로 설정했는데 정상적으로 작동했습니다. 그래서 같은 코드 :NetworkStream에서 XML 비 직렬화가 실패합니다.
보낸 사람 :
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으로 읽은 다음 디시리얼라이저로 전달해야합니까?
좋은 캐치, 나 자신과 같은 줄을 생각하고 있었다. 저에게 몇 가지 연구를 저장하고 새로운 것을 배웠습니다. – Nevyn
[NetworkStream.DataAvailable] (http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.dataavailable.aspx) 그것은 당신의 시나리오에서 도움이 될 것이라고 생각하지 마십시오. – publicgk