我正在创建一个程序,需要在客户端和服务器之间高效地发送数据。为了清晰地组织数据包,我使用序列化技术。然而,当我对这些数据包进行序列化时,数据变得不必要地大。为了让您理解我的需求,我将解释我正在做的事情。
我的数据包类的工作方式如下:我有一个 Packet 对象:
我的数据包类的工作方式如下:我有一个 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倍。
为什么序列化的数据会如此庞大?是否有任何方法可以减小其大小而仍然保持数据包作为自己的类时的组织结构不变?
注意:我只想序列化像这样的简单属性,没有复杂的内容。
BinaryFormatter
不是进行机器到机器序列化的好选择,如果两台机器具有不同版本的核心 .NET DLL(例如一台机器还没有运行 Windows 更新时,.NET 的热修复已经发布),则您的数据将无法反序列化。 (我甚至不建议将其用于保存到磁盘以供同一台机器使用,唯一可以在不担心反序列化问题的情况下使用它的地方是在同一台机器上进行 IPC 通信) - Scott Chamberlain