2011-12-19 7 views
1

多くのパケットを送信するネットワークアプリケーションを開発しています。現在のところ、私のシリアル化の方法は、オブジェクトのリストを取得し、それらをパイプ文字 '|'で区切られた文字列に変換するハックです。それをネットワークストリームにフラッシュします(またはUDP経由で送信します)。C# - ネットワーク上でパケットをシリアライズ

パケットサイズ(ありませんので、巨大なXMLシリアル化)を最小限に抑えながら、私はC#でこれにクリーンな解決策を探しています。

BinaryFormatter is SLOWと私の経験。私はまた、パケットを圧縮してbase64文字列にエンコードし、クライアント側でそれらをデコードすることも検討しています。私はこれがアプリケーションのパフォーマンスにどのように影響するか見てみたいと思っています。

はまた、別の簡単な質問:

私のセットアップは、2つのソケット(1 TCP and UDP)を作成し、クライアントは、これらの二つのソケットに個別に接続されています。データは、必要に応じて(重要なものについてはTCP、重要でないものについてはUDP)、どちらかに基づいて削除されます。これは初めてTCP/UDPを使用していて不思議に思っていました

もっと統一された方法があれば、そうは思われません。

素晴らしいサポートのためにいつもありがとうございます。

答えて

2

ためProtoBufを使用しての中に見ることができます。 John Skeetのprotobuf-csharp-portを使用すると、それぞれIMessageとIBuilderでWriteDelimitedToメソッドとMergeDelimitedFromメソッドを使用できます。これらは、メッセージの先頭にバイト数を付加し、相手側で消費できるようにします。定義のメッセージは本当に簡単です:

message MyMessage { 
    required int32 number = 1; 
} 

その後は、ProtoGen.exeとC#クラスを構築し、ちょうど町に行きます。 protobuffers(特にprotobuf-csharp-port)の大きな利点の1つは、すべてのエンドポイントを同時にアップグレードする必要はないということです。新しいフィールドは、以前のバージョンでもエラーなく追加および使用できます。このバージョンの独立性は非常に強力することができますが、あなたはそれのために計画していない場合も、あなたをかむことができます。

0

私は個人的に次のシステムを使用しています: 抽象的なパケットクラスを持っています、すべてのパケットはから派生しています。パケットクラスは、2つの仮想メソッドを定義します。

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(); 
    } 
} 
+0

BinaryReader/Writerを避ける理由は、BinaryFormatterの遅さのためです。このVS BFormatterのスピードに関するアイデアは? –

0

私は大量のパケットを送信し、ネットワークアプリケーションを開発しています)

チェックアウトnetworkComms.net 、オープンソースのネットワーク通信ライブラリは、かなりの時間を節約するかもしれません。これは直列化のためのprotobufを組み込んでいます。その例はhere、行408です。

関連する問題