2013-03-08 2 views
0

내 응용 프로그램이 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으로 읽은 다음 디시리얼라이저로 전달해야합니까?

답변

1

참조 : Deserializing data sent via TCP

마지막 바이트를 읽을 때는 NetworkStream이 통지하지 않습니다이 제안에 대한 답변. 그래서 당신의 deserialializer는 NetworkStream으로부터 (심지어 NetworkStream이 그것을 알리지 않기 때문에) 끝까지 읽은 후에도 계속해서 읽으려는 것으로 보입니다. 따라서 예외가 발생합니다. MemoryStream을 읽어야합니다.

+0

좋은 캐치, 나 자신과 같은 줄을 생각하고 있었다. 저에게 몇 가지 연구를 저장하고 새로운 것을 배웠습니다. – Nevyn

+0

[NetworkStream.DataAvailable] (http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.dataavailable.aspx) 그것은 당신의 시나리오에서 도움이 될 것이라고 생각하지 마십시오. – publicgk

0

전체 XML 파일을 받았을 때 어떻게 알 수 있습니까? 원격 장치가 연결을 닫지 않은 한 Read (XmlSerializer)을 호출하면 데이터가 차단되고 대기합니다.

+1

나는 전에 실제로 그 문제가 있었지만,이 경우에는 차단되지 않고 무언가를 잘못 읽고 예외를 던졌습니다. – Mason

관련 문제