2011-08-16 4 views
8

私はJavaのネイティブ直列化が遅いプロジェクトで作業していますので、優れたパフォーマンスを得るためにクラスに対してExternalizeインタフェースを実装します。自動的にJava外部化可能なreadExternal()/ writeExternal()ブロックを生成します。

しかし、これらのクラスには多くのデータメンバーがあり、これらの2つのメソッドを記述する際に間違いを犯すのは簡単です。私たちは、これらの関数でクラスのすべてのメンバーを読み書きしていますが、何も気にしません。オフラインプロセスまたはコンパイル時に自動的に外部化するブロックを writeExternal()個生成する方法はありますか?

私はhttp://projectlombok.org/を見ましたが、そのようなものは理想的でした。

同様に、私たちはこれらのクラスを不変に保ちたいが、不変クラスは外部化可能なインタフェースを実装できない - 有効なjavaからのプロキシクラスパターンを使いたい。

答えて

1

私は、Javaのネイティブシリアル化が

どのように遅い遅いプロジェクトに取り組んでいますか?どうして?多くの手作業でコーディングを高速化することは、長期的には経済的に実行可能か維持可能かはほとんど考えられません。シリアライゼーションのオーバーヘッドは、実際にはトランスミッションで時間と空間の境界に達するはずです。 Javaのデフォルトの直列化が、あなたが計画しているすべての手作業コーディングの結果よりも驚くほど遅くなければならない特別な理由はありません。あなたは原因を調べる方が良いでしょう。たとえば、よく配置されたBufferedOutputStreamがすべての問題を解決することがあります。

+1

実行時にリフレクションを使用してシリアル化を行いますが、これは常に遅くなります。異なるシリアル化方法の比較については、http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarkingをご覧ください。 – MrLebowski

+0

@MrLebowski私はReflectionの使用を認識していますが、実際にはネットワークとディスクの帯域幅を支配していますか?彼らはテストにそれを含めましたか?たとえば、ByteArrayOutputStreamsにシリアル化するだけですか?あなたはこれがすべて完全に学業であることをよく見いだすかもしれません。 – EJP

+0

それを指摘してくれてありがとう。 http://pastebin.com/yi4JhhVb ---外部からのシリアライズに関連した時間の増加がシリアライズ可能になるのは、ちょうど1ms前後です。これはネットワーク時間の悪化です。私は圧縮されたストリームを試して、それが役立つかどうかを見ています。外部化可能な自動化された、または自動化されたシリアライゼーションがさらに最適化されます。 – MrLebowski

関連する問題