我正在开发一个发送大量数据包的网络应用程序。目前,我的序列化方法只是一个hack,它接受一个对象列表并将它们转换为由管道字符“|”分隔的字符串。并将其刷新到网络流中(或者只是通过UDP发送出去)。
我正在寻找一种更简洁的C#清洁解决方案 数据包大小(因此没有大量的XML序列化)。
我对BinaryFormatter is SLOW
的体验。我也在考虑通过将数据包编码为base64
字符串来压缩我的数据包,并在客户端解码它们。我希望看到这将如何影响我的应用程序的性能。
另外,另一个快速问题:
我的设置创建了2个套接字(一个TCP and UDP
),客户端分别连接到这两个套接字。根据需要刷新数据(TCP表示重要的东西,UDP表示不重要的东西)。这是我第一次同时使用TCP / UDP并且想知道
如果有更统一的方法,虽然看起来不是这样。
一如既往地感谢您的支持。
答案 0 :(得分:2)
我会使用类似于Google's Protocol Buffers的二进制协议。使用John Skeet的protobuf-csharp-port可以分别在IMessage和IBuilder上使用WriteDelimitedTo和MergeDelimitedFrom方法。这些将在消息前面加上字节数,以便它们可以在另一端消耗。定义消息非常简单:
message MyMessage {
required int32 number = 1;
}
然后用ProtoGen.exe构建C#类,然后去城里。 protobuffers(特别是protobuf-csharp-port)的一大好处是不是每个端点都需要同时升级。以前的版本可以添加和使用新字段而不会出现错误。这个版本的独立性可能非常强大,但是如果你没有计划它也可以咬你;)
答案 1 :(得分:1)
您可以考虑使用ProtoBuf进行序列化
答案 2 :(得分:0)
我个人使用过以下系统: 有抽象的Packet类,所有的数据包都派生自。 Packet类定义了两个虚拟方法:
void SerializeToStream(BinaryWriter serializationStream)
void BuildFromStream(BinaryReader serializationStream)
此手动序列化可以创建小型数据包。 在发送到套接字之前,数据包的长度为前缀,并且前缀为唯一的数据包类型ID号。接收端然后可以使用Activator.CreateInstance来构建适当的数据包并调用BuildFromStream来重建数据包。
示例包:
class LocationUpdatePacket : Packet
{
public int X;
public int Y;
public int Z;
public override void SerializeToStream(BinaryWriter serializationStream)
{
serializationStream.Write(X);
serializationStream.Write(Y);
serializationStream.Write(Z);
}
public override void BuildFromStream(BinaryReader serializationStream)
{
X = serializationStream.ReadInt32();
Y = serializationStream.ReadInt32();
Z = serializationStream.ReadInt32();
}
}
答案 3 :(得分:0)
我正在开发一个发送大量数据包的网络应用程序
查看开源网络通信库networkComms.net可能会为您节省大量时间。它包含用于序列化的protobuf,其中一个例子是here,第408行。