【问题标题】:XML serialization of objects through Sockets通过 Socket 对对象进行 XML 序列化
【发布时间】: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


【解决方案1】:

试试这个。干净多了:

  //---------------------------------------------------------------------
        public static Byte[] ObjectToByteArray<T>(T obj)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                XmlSerializer xmlS = new XmlSerializer(typeof(T));
                xmlS.Serialize(ms, obj);

                return ms.ToArray();
            }
        }
        //---------------------------------------------------------------------
        public static T ByteArrayObject<T>(Byte[] bObj)
        {
            using (MemoryStream ms = new MemoryStream(bObj))
            {
                XmlSerializer xmlS = new XmlSerializer(typeof(TheMessage));
                return (T)xmlS.Deserialize(ms);
            }
        }
        //---------------------------------------------------------------------
        public static void Sending(Byte[] bData)
        {
            Stream stm = client.GetStream();

            // always write size first when using TCP
            Byte[] bSize = BitConverter.GetBytes(bData.Length);
            stm.Write(bSize, 0, bSize.Length);
            stm.Write(bData, 0, bData.Length);
        }

        //---------------------------------------------------------------------
        public static void Receiving(Byte[] bData)
        {
            Byte[] bSize = new Byte[sizeof(Int32)];
            s.Read(bSize, 0, bSize.Length);

            Byte[] bData = new Byte[BitConverter.ToInt32(bSize, 0)];
            s.Read(bData, 0, bData.Length);

            TheMessage m = ByteArrayObject<TheMessage>(bData);
        }

【讨论】:

  • 好的,现在可以了。除了在Receiving() 中你写的s.Read()Read()NetworkStream 不是Socket 的方法,但我创建了一个NetworkStream(s),所以没关系。我传输数据时没有出错,但我没有得到可视化的文本。我看到每当我从客户端发送 smth - 服务器控制台窗口上的光标向下一行,但没有可视化文本。那应该是因为我目前没有任何数据作为String 写入控制台,所以它只是换行。所以可能我根本没有得到任何信息......?
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多