代码之家  ›  专栏  ›  技术社区  ›  Luca

XML序列化程序。通过网络流反序列化块

  •  4
  • Luca  · 技术社区  · 14 年前

    我正在尝试通过网络流发送XML可序列化对象。

    我已经在一个UDP广播服务器上使用了它,在那里它接收来自本地网络的UDP消息。这里是服务器端的一个片段:

    while (mServiceStopFlag == false) {
        if (mSocket.Available > 0) {
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, DiscoveryPort);       byte[] bData;
    
        // Receive discovery message
        bData = mSocket.Receive(ref ipEndPoint);
        // Handle discovery message
        HandleDiscoveryMessage(ipEndPoint.Address, bData);
        ...
    

    相反,这是客户端:

    IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Broadcast, DiscoveryPort);
    MemoryStream mStream = new MemoryStream();
    byte[] bData;
    
    // Create broadcast UDP server
    mSocket = new UdpClient();
    mSocket.EnableBroadcast = true;
    
    // Create datagram data
    foreach (NetService s in ctx.Services)
        XmlHelper.SerializeClass<NetService>(mStream, s);
    bData = mStream.GetBuffer();
    
    // Notify the services
    while (mServiceStopFlag == false) {
        mSocket.Send(bData, (int)mStream.Length, ipEndPoint);
        Thread.Sleep(DefaultServiceLatency);
    }
    

    它工作得很好。

    但是现在我想得到同样的结果,但是 TcpClient 插座,但直接使用 XMLSerializer 实例:

    在服务器端:

        TcpClient sSocket = k.Key;
    ServiceContext sContext = k.Value;
    Message msg = new Message();
    
    while (sSocket.Connected == true) {
        if (sSocket.Available > 0) {
            StreamReader tr = new StreamReader(sSocket.GetStream());
            msg = (Message)mXmlSerialize.Deserialize(tr);
    
            // Handle message
            msg = sContext.Handler(msg);
            // Reply with another message
            if (msg != null)
                mXmlSerialize.Serialize(sSocket.GetStream(), msg);
        } else
            Thread.Sleep(40);
    }
    

    在客户方面:

    NetworkStream mSocketStream;
    Message rMessage;
    
    // Network stream
    mSocketStream = mSocket.GetStream();
    
    // Send the message
    mXmlSerialize.Serialize(mSocketStream, msg);
    // Receive the answer
    rMessage = (Message)mXmlSerialize.Deserialize(mSocketStream);
    
    return (rMessage);
    

    数据已发送(可用属性大于0),但方法 XmlSerialize.Deserialize (应该对消息类进行反序列化)块。

    我错过了什么?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Mathieu Devost leeeroy    11 年前

    当然,因为序列化程序继续读取 NetworkStream 它不会在遇到主要的结束元素时结束。

    为了达到预期的效果,有必要使用 MemoryStream ,在读取最后一个字节时通知流的结尾。