Ошибка при передаче данных 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
был встречен