Ошибка при передаче данных XML через сокеты TCP: XmlException: элемент Document не появился

Я пытаюсь создать онлайн-игру в шашки, чтобы начать изучение сетей. У меня есть архитектура сервер / клиент, и я использую сокеты TCP. Я хотел бы отправить кастом object через поток. Я использую систему сериализации XML, чтобы сделать это, и все, кажется, работает, пока клиенту не нужно десериализовать "сериализованное" сообщение с сервера. Когда эта точка достигнута, я получаю эту ошибку:

XmlException: элемент документа не появился. Строка 1, позиция 1. Mono.Xml2.XmlTextReader.Read () System.Xml.XmlTextReader.Read () System.Xml.XmlReader.MoveToContent () System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot () System.Xml.Serialization.XmlSerializer.Deserialize (читатель System.Xml.Serialization.XmlSerializationReader)

Это функция, которую я использую для сериализации объекта:

private string Serialize(List<PieceInfo> pieces)
{

    StreamWriter stWriter = null;
    XmlSerializer xmlSerializer;
    string buffer;
    try
    {
        xmlSerializer = new XmlSerializer(typeof(List<PieceInfo>));
        MemoryStream memStream = new MemoryStream();
        stWriter = new StreamWriter(memStream);
        XmlSerializerNamespaces xs = new XmlSerializerNamespaces();
        xs.Add("", "");
        xmlSerializer.Serialize(stWriter, pieces, xs);
        buffer = Encoding.ASCII.GetString(memStream.GetBuffer());
        return buffer;
    }


    catch (Exception Ex)
    {
        throw Ex;
    }    
}

Это функция, которую я использую для десериализации:

public List<PieceInfo> DeSerialize(string xmlString) 
{
    XmlSerializer xmlSerializer;
    MemoryStream memStream = null;
    try
    {
        xmlSerializer = new XmlSerializer(typeof(List<PieceInfo>));            

        byte[] bytes = new byte[xmlString.Length];
        Encoding.ASCII.GetBytes(xmlString, 0, xmlString.Length, bytes,0);
        memStream = new MemoryStream(bytes);
        memStream.Seek(0, SeekOrigin.Begin);
        object objectFromXml = xmlSerializer.Deserialize(memStream);
        List<PieceInfo> pieces = (List<PieceInfo>)objectFromXml;
        return pieces;
    }
    catch (Exception Ex)
    {
        throw Ex;
    }
} 

Код отправки сообщения:

StreamWriter writer = new StreamWriter(tcpClient.GetStream());
writer.WriteLine("GRABB~"+ Serialize(ListPiecesForSerilization));
writer.Flush();

Код получения сообщений:

private void OnIncomingData(string data)
{
    string[] lines;
    lines = data.Split('~');
    for (int i = 0; i != lines.Length; i++)
    {
        switch (lines[i])
        {                                          
            case "GRABB": // get board's current condition
                List<PieceInfo> pieces = DeSerialize(lines[i+1]);
                board.SetPiecesPosition(pieces);
                break;
        }
            //Debug.Log(data);
    }
}

PieceInfo класс, содержит основную информацию о произведении:

[Serializable]
public class PieceInfo 
{
    public int xPos;
    public int zPos;
    public bool isWhite;
    public bool isKing;

    public void SetPieceInfo(int x, int z, bool c, bool k)
    {
        xPos = x;
        zPos = z;
        isWhite = c;
        isKing = k;
    }
}

Класс PieceInfo помечен атрибутом [Serializable] но я не установил никаких других атрибутов.

Я отправляю сообщение XML как string с помощью NetworkStream а также StreamWriter/StreamReader,

Почему я получаю сообщение об ошибке при попытке десериализации сообщения?

1 ответ

Проблема заключалась в том, что я использовал StreamWriter.WriteLine а также StreamReader.ReadLine() который не писал / не читал дыру в XML-файле. я использовал StreamReader.Read() в цикле, пока символ, который я установил в качестве знака для "end-of-fileбыл встречен

Другие вопросы по тегам