gpt4 book ai didi

c# - 更高效的数据包序列化

转载 作者:行者123 更新时间:2023-11-30 16:13:48 26 4
gpt4 key购买 nike

我正在创建一个程序,它必须在客户端和服务器之间有效地发送数据。为了清楚地组织数据包,我使用序列化。但是,当我序列化这些数据包时,数据不必要地大。我将解释我在做什么,以便您了解我需要什么。

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

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 并手动写入信息时更大”,带有信息 你的意思是属性值。但是,您使用的序列化程序不仅序列化数据,还序列化一些关于 的信息。您可以通过在文本编辑器中查看序列化数据来了解这一点。

Is there any way to decrease it while still keeping everything organized with packets as their own classes?

使用更专业的序列化,例如 protobuf或图书馆 suggested by @Piotr .

此外,我认为您的序列化代码不应位于 Packet 基类中,而应位于单独的类中,例如 PacketEncoder

关于c# - 更高效的数据包序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21224003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com