2011-08-14 2 views
2

私はすべての通信にソケットを使用する単純なクライアント/サーバーアプリケーションを開発しています。通信はパケットベースであり、パケットのコンセプトはクラスのセットとソケットストリーム用の/ObjectOutputStreamラッパーを使用して実装されます。ObjectInputStream/ObjectOutputStreamを使用してJavaのネットワーク "パケット"を実装する場合の長所と短所はありますか?

完全なテキストベースのプロトコル(IRCなど)と比較してこのアプローチに不利な点があるかどうか、私が明示的にバイトを処理するところの「非常にバイナリな」ものがあるかどうかわかりません。

ここでトラフィックの問題(「qwerty」と「qwerty」+ 1KBのメタデータ)を無視し、信頼性と保守性のみを考慮しましょう。

あなたはどう思いますか?

答えて

5

個人的には、Javaに組み込まれたバイナリシリアル化が非常に苦痛を感じています。それはludicrouslyあなたが何かを変更していなくてもバージョンの非互換性で終わるのは簡単です。が問題を引き起こすと予想しています。あれば問題ありません

:あなたはあなたの顧客を保証することができます

  • /サーバは、すべてのコードのまったく同じバージョンを実行します。
  • 以前のバージョンで作成されたデータを読む必要はありません。

多分あなたの状況ですが、個人的に私はバージョン管理でより柔軟に対応できるシリアル化形式を好みます。今では、バイナリでもテキストでもなくてもかまいません。 JSON、Protocol BuffersThriftなどの任意の数のオプションを使用できます。それぞれには別々の賛否両論がありますが、それぞれがJavaよりもバージョンの互換性を考慮して設計されている可能性があります。

Javaシリアル化のの上向きは、すべてが動作する状況(ツリー全体がシリアライズ可能)にある間は、他の変更なしでシリアライズできます。データをモデル化する必要はありませんいくつかのシリアライゼーションフレームワークと同様に、残念ながら、があなたのツリーのどこかでシリアライズ可能なではないクラスを使用したい場合は、すぐに痛みを感じます。

テキスト形式とバイナリ形式の選択については、賛否両論合理的にが明らかです。テキストは大きくなりますが、ネットワークのトレースを見るだけで、何が起こっているのかを簡単に診断できます。もちろん、両方のエンコーディングを同じにする必要があります。

ああ、あなたは非Javaクライアント/サーバーと通信したい場合は、Javaのネイティブシリアル化を使用していた場合はもちろん、あなたが苦労しています:)

+1

+1:ほとんどのバイナリ形式はテキスト形式よりも小さくなりますが、テキストのシリアル化はJavaのシリアル化よりも小さくなります(後でかなり非効率的です)。 –

2

It.saの痛みにシリアル化されたオブジェクトとの後方互換性を維持し、Java以外のクライアントはあなたのサービスと対話できません。シリアライズされたオブジェクトは、シリアライズされたサイズに関してもあまり良くありません。

代わりにプロトコルバッファのようなものを使用します。

関連する問題