Моя идея -> система клиентского сервера, обменивается текстовыми сообщениями (цепочками) через сокеты TCP. Я хочу, чтобы протокол между клиентом и сервером основывался на XML. И поскольку информация между сокетами отправляется как byte
, мне нужно отдать. Итак, вот что я делаю: Класс TheMessage
с имуществом типа string
. Я делаю объект этого класса со строкой, которая будет отправлена как свойство объекта, и сделайте ее от Object
до byte[]
до XmlSerialization
. С другой стороны, я делаю процесс наоборот. Это, как я сериализовать и отправить от клиента к серверу:XML-сериализация объектов через сокеты
msg.Message = Console.ReadLine();
byte[] writeBuff = XmlRefacrotClient.ObjectToByteArray(msg);
Stream stm = client.GetStream();
stm.Write(writeBuff, 0, writeBuff.Length);
это метод я использую для сериализации:
public static byte[] ObjectToByteArray(TheMessage obj)
{
try
{
MemoryStream ms = new MemoryStream();
XmlSerializer xmlS = new XmlSerializer(typeof(Message.TheMessage));
XmlTextWriter xmlTW = new XmlTextWriter(ms, Encoding.UTF8);
xmlS.Serialize(xmlTW, obj);
ms = (MemoryStream)xmlTW.BaseStream;
return ms.ToArray();
}
catch(Exception)
{
throw;
}
}
это, как я получаю данные на стороне сервера:
byte[] readBuff = new byte[1024];
s.Receive(readBuff);
String str = (XmlRefactorServer.ByteArrayToObject(readBuff)).ToString();
Console.WriteLine(str);
и это метод де-сериализации:
public static Object ByteArrayToObject(byte[] arr)
{
try
{
XmlSerializer xmlS = new XmlSerializer(typeof(Message.TheMessage));
MemoryStream ms = new MemoryStream();
XmlTextWriter xmlTW = new XmlTextWriter(ms, Encoding.UTF8);
return xmlS.Deserialize(ms);
}
catch(Exception)
{
throw;
}
}
Все проходит гладко до тех пор, return
из ByteArrayToObject
не method.I получить InvalidOperationException
с описанием There is an error in XML document (0, 0).
на return xmlS.Deserialize(ms);
линии.
Любые предложения?
Вы взяли массив байтов и преобразовали его в строку или что-то еще, чтобы увидеть, как это выглядит? Возможно, вы можете обнаружить ошибку в XML, если увидите, как она выглядит. – guysherman
Сначала я сделал это только путем преобразования строки -> byte array -> string (для проверки самого соединения), и он работал нормально. Я получал и отправлял сообщения в обоих направлениях. – Milkncookiez