XML文档中有一个错误(170,46)

本文关键字:错误 文档 有一个 XML | 更新日期: 2023-09-27 18:14:04

我想通过套接字连接发送一个对象列表。我知道WCF服务将是一个更好的选择,但它不是我的选择。

我正在使用这个代码发送数据

    private void tm_Tick(object sender, EventArgs e)
    {
        XmlSerializer formatter = new XmlSerializer(typeof(List<Objects.PIP>));
        MemoryStream stream = new MemoryStream(1024);
        formatter.Serialize(stream, Repository.GlobalRepository.PIPInformation);
        byte[] bt = stream.ToArray();
        foreach (Communication.Client Client in server.ClientList)
        {
            Client.SendMessage(bt);
        }
        stream.Flush();
    }
    public void SendMessage(Byte[] bytesSent)
    {
        SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs();
        writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length);
        socket.SendAsync(writeEventArgs);
    }

似乎工作得很好。

接收数据,我在线程上使用此代码。

void ReceiveData()
    {
        try
        {
            while (true)
            {
                if (disposed == true)
                    return;
                data = new byte[socket.ReceiveBufferSize];
                var recv = socket.Receive(data);
                XmlSerializer formatter = new XmlSerializer(typeof(List<Object.PIP>));
                MemoryStream stream = new MemoryStream(data);
                **Classes.TickerInformation.PIPList= (List<Object.PIP>)formatter.Deserialize(stream);**
            }
            socket.Close();
            return;
        }
        catch (Exception ex)
        {
        }
    }

我得到一个异常有一个错误在XML文档(170,46)。在这一行:Classes.TickerInformation。PIPList =(列表)formatter.Deserialize(流);

我假设所有的数据都没有被接收,所以这正在发生。

XML文档中有一个错误(170,46)

问题是您直到最后才收到整个XML -因此您只序列化XML的初始部分。你必须从套接字中读取,直到没有数据为止。

我建议设置一个由客户端发送的结束符字符串,以便您查找它以知道您已完全收到消息。

请记住,套接字不是基于请求-响应的。打开套接字并继续阅读