![](/img/trans.png)
[英]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.