[英]Serializing / Marshalling simple objects in C# to send over network, for an unmanaged C++ application to read
[英]C# - Serializing Packets Over a Network
我正在开发一个发送大量数据包的网络应用程序。 目前,我的序列化方法只是一个hack,它接受一个对象列表并将它们转换为由管道字符“|”分隔的字符串。 并将其刷新到网络流中(或者只是通过UDP发送出去)。
我正在寻找一种更清洁的C#解决方案,同时最大程度地减少数据包大小(因此不进行大量XML序列化)。
我对BinaryFormatter is SLOW
体验BinaryFormatter is SLOW
。 我也在考虑通过将数据包编码为base64
字符串来压缩我的数据包,并在客户端对它们进行解码。 我想看看这将如何影响我的应用程序的性能。
另外,另一个快速问题:
我的设置创建2个套接字(一个TCP and UDP
),客户端分别连接到这两个套接字。 根据需要刷新数据(TCP表示重要的东西,UDP表示不重要的东西)。 这是我第一次同时使用TCP / UDP并且想知道
如果有一个更统一的方法,尽管看起来并非如此。
一如既往地感谢您的大力支持。
我会使用类似于谷歌的协议缓冲区的二进制协议。 使用John Skeet的protobuf-csharp-port,可以分别使用IMessage和IBuilder上的WriteDelimitedTo和MergeDelimitedFrom方法。 这些将在消息前面加上字节数,以便它们可以在另一端消耗。 定义消息非常简单:
message MyMessage {
required int32 number = 1;
}
然后用ProtoGen.exe构建C#类,然后去城里。 protobuffers(特别是protobuf-csharp-port)的一大好处是不是每个端点都需要同时升级。 以前的版本可以添加和使用新字段而不会出现错误。 这个版本的独立性可能非常强大,但是如果你没有计划它也会咬你;)
您可以考虑使用ProtoBuf进行血清化
我个人使用了以下系统:有抽象的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();
}
}
我正在开发一个发送大量数据包的联网应用程序
查看一个开源网络通信库networkComms.net可能会为您节省大量时间。 它集成为protobuf的序列化,其中的一个例子是在这里 ,线408。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.