更有效的数据包序列化



我正在创建一个程序,该程序必须在客户端和服务器之间高效地发送数据。为了清晰地组织数据包,我使用了序列化。然而,当我串行化这些数据包时,数据会过大。我会解释我在做什么,这样你就能理解我需要什么。

我的包类是这样工作的。我有一个Packet对象:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class Packet
{
public static byte[] Serialize(Object o)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, o);
return ms.ToArray();
}
public static Object Deserialize(byte[] bt)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
ms.Write(bt, 0, bt.Length);
ms.Position = 0;
object obj = bf.Deserialize(ms);
ms.Close();
return obj;
}
}

然后我可以创建从Packet类继承的其他类,这里有一个例子:

using System;
[Serializable]
public class PacketUserInfo : Packet
{
public string Name;
public int Age;
}

然后,将其放入字节数组并发送它非常简单(当然,上面的数据包只是一个示例)。但是,得到的数组的大小至少是使用BinaryWriter并手动写入信息时的10倍。

为什么序列化的数据如此之大?有没有什么方法可以减少它,同时仍然将数据包作为自己的类进行组织?

注意:我只打算序列化像这样的简单属性,没有什么特别的。

您所说的"为什么序列化的数据[…]比我使用BinaryWriter并手动写入信息时要大">,其中信息是指属性值。但是,您使用的序列化程序不仅序列化数据,还序列化关于的一些信息。您可以通过在文本编辑器中查看序列化的数据来看到这一点。

有什么方法可以减少它,同时仍然将数据包作为自己的类来组织一切吗?

使用更专业的序列化,如protobuf或@Piotr建议的库。

此外,我认为您的序列化代码不应该驻留在Packet基类中,而应该驻留在一个单独的类中,如PacketEncoder

最新更新