【发布时间】:2013-04-18 22:29:13
【问题描述】:
我的想法 -> 客户端服务器系统,通过 TCP 套接字交换文本消息(字符串)。我希望客户端和服务器之间的协议基于 XML。而且因为套接字之间的信息是以byte 发送的,所以我必须进行转换。所以这就是我所做的:
类 TheMessage,属性类型为 string。我使用要作为对象属性发送的字符串来制作该类的对象,并将其从Object 变为byte[] 到XmlSerialization。另一方面,我做反之亦然的过程。
这是我序列化并从客户端发送到服务器的方式:
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;
}
}
在ByteArrayToObject 方法的return 之前,一切都很顺利。我在return xmlS.Deserialize(ms); 行上得到InvalidOperationException 和描述There is an error in XML document (0, 0).。
有什么建议吗?
【问题讨论】:
-
你有没有把字节数组转换成字符串什么的,看看它是什么样子的?如果您看到它的样子,也许您可以发现 XML 中的错误。
-
我首先只是通过转换字符串 -> 字节数组 -> 字符串(以测试连接本身)来做到这一点,它工作正常。我正在双向接收和发送消息。
标签: c# .net tcp xml-serialization xml-deserialization