我使用TcpClient和TcpListener類在兩個應用程序之間交換一些對象。我使用XML序列化(請參閱下面的代碼)。基本上一切工作正常。問題是,當一個應用程序在短時間內發送多個對象時,我在接收端的MemoryStream中有多個對象(多個根元素,也帶有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>
我刪除的try/catch,調試的東西,一切不必要的
無論何時發送數據,您都需要使用以下一種或多種技術來終止每條消息:1)ASCII:使用消息中未使用的已知字符終止每條消息2)ASCII或二進制:向具有字節數的消息添加前綴。 3)Ascii或Binary:發送修復長度消息。在你的情況下,我會用ETX(0x03)或EOT(0x04)等字符來終止每個DataModel元素。然後在保存xml之前刪除字符。分別處理每個元素。 – jdweng