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