2016-09-13 4 views
0

TcpClient 및 TcpListener 클래스를 사용하여 두 응용 프로그램간에 객체를 교환합니다. XML 직렬화 (아래 코드 참조)를 사용합니다. 기본적으로 모든 것이 잘 작동합니다. 문제는 한 애플리케이션이 짧은 기간에 여러 객체를 전송할 때 수신 측의 MemoryStream에 여러 객체가있는 것입니다 (다중 루트 요소, XML 버전 태그 포함). 어떻게 모든 객체를 처리 할 수 ​​있으며 그렇게하려면 가장 좋은 방법은 무엇입니까? 목록에 개체를 그룹화하고 목록 전체를 de/serialize 할 수 있지만 조만간 똑같은 문제에 직면하게 될 것입니다. 이것은 일반적인 문제인 것으로 보입니다. 그러나 아직 해결책을 찾지 못했습니다.여러 객체를 사용하여 스트림에서 XML을 비 직렬화

객체 직렬화 :

public class DataModel 
{ 
    public string Command { get; set; } 
    public string Value { get; set; } 

    // ctor etc 
} 

수신 측 :

private void onRead(IAsyncResult ar) 
    {  

     int nBytes = _client.GetStream().EndRead(ar); 

     XmlSerializer serializer = new XmlSerializer(typeof(DataModel)); 
     MemoryStream memStream = new MemoryStream(buffer); 
     DataModel dmo = (DataModel)serializer.Deserialize(memStream); 
     buffer = new byte[1024]; 
     _client.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(onRead), null); 

     // read on if more available... 

    } 

예 스트림 내용 : 나는 불필요한 시도/캐치, 디버그 사물과 모든 것을 제거

<?xml version="1.0"?> 
<DataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Command>XXX</Command> 
    <Value>1.0</Value> 
</DataModel><?xml version="1.0"?> 
<DataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Command>XXX</Command> 
    <Value>5</Value> 
</DataModel><?xml version="1.0"?> 
<DataModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Command>XXX</Command> 
    <Value>YYY</Value> 
</DataModel> 

+0

데이터를 보낼 때마다 다음 기술 중 하나 이상을 사용하여 각 메시지를 종료해야합니다. 1) ASCII : 메시지에 사용되지 않는 알 수있는 문자로 각 메시지 종료 2) ASCII 또는 이진 : 바이트 수의 메시지에 접두사를 추가합니다. 3) Ascii 또는 Binary : 고정 길이 메시지를 보냅니다. 귀하의 경우에는 ETX (0x03) 또는 EOT (0x04)와 같은 문자로 각 DataModel 요소를 종료합니다. 그런 다음 xml을 저장하기 전에 문자를 제거하십시오. 각 요소를 별도로 처리하십시오. – jdweng

답변

0

첫째, 당신은이 패턴에 동의 했습니까? 어쩌면 다른 응용 프로그램은 버그가 있으며 각 XML 문서를 별도로 보내야합니다. 어떤 캐스트에서, 이건 당신이 고칠 문제가 아니에요.

, 당신이 동의 않았거나 영구 연결 사용하는 경우 :

귀하의 문제는 정말 XML을 관련되지 않습니다. 열려있는 연결을 통해 오는 모든 유형의 콘텐츠에서 동일한 문제가 발생할 수 있습니다.

문제는 입력 스트림을 올바르게 프레이밍하지 못하는 것입니다.

스트림에서 각 개별 XmlDocument를 개별적으로 읽고 각각 자체 내부 스트림을 읽었습니다. 그렇다면 이제는 유효한 XML이므로 원하는대로 할 수 있습니다.

바이트 단위로 읽을 수 있으며 다음 문서를 나타내는 선언을 찾거나 XmlReader를 사용하여 다음 선언을 테스트 할 수 있습니다. 그렇지 않으면 예외가 발생합니다.