問題タブ [kryo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
10389 参照

java - Kryoでの自動クラス登録

私が理解しているように、Kryo はすべてのclassName<->numberIDマップを作成します。writeObject. このマップは狭すぎます。オブジェクト モデルでは、インスタンスが同じクラスに属する傾向があるため、次の writeObject は同様のマップを再度 (何度も何度も) 構築してシリアル化します。クラスを手動で登録することでマップを共有できることは知っていますが、これは面倒な手動ハードコーディングです。通常どおり、最初のオブジェクトの書き込みによってマップが開始されることを望みますが、セッション内の後続のすべての書き込みはそれを再利用して拡張します。このように、登録は実行時に自動的に行われ、追加の実行時のオーバーヘッドはなく、より頻繁に使用されるオブジェクトは自然に低い ID 番号を受け取ります。マップは、後で個別に、添付ファイルに復号化キーとして保存できます。デシリアライザーは、このマップをロードすることで開始します。このアイデアはどのように気に入りましたか? また、どのように実装できますか?

私の質問は 、ユーザーがリストを使用して単一の writeObject の下ですべての書き込みを組み合わせることができるkryo でクラスを登録するためのこの戦略に似ています。私が提案するように、マップを個別に保存するよりもさらに簡単です。しかし、彼はそうしたくないようです。私の場合、Javaモデルが大きいため、このような組み合わせは不可能です。断片的にシリアル化することで、完全にメモリに保持することを避けています。私のシナリオでは、ユーザーはプロジェクトを開き、変更を加えてフラッシュします。したがって、プロジェクトはクラスのマップを維持し、それをすべてのシリアライゼーションに使用できます。

アップデート!クラス/オブジェクト登録者と自動リセットがあることに気付きました。それらは、タスクに合わせて作成されているようです。しかし、これらがどのように解決するのかわかりません。Autoreset=false実際、2番目の書き込みははるかに小さくなります。ただし、この場合、オブジェクトのデシリアライズに失敗します。例でわかるように、2 番目の逆シリアル化は失敗します。

出力は

Update2クラス名に加えて、autoReset=false がオブジェクト参照を記録する場合もあります。確かに自動リセットする価値があります。

Update3登録には kryo オブジェクトを参照し、状態を保持するシリアライザーが含まれているため、クラスのマップ (つまり、クラス -> 登録) をシリアル化するのが難しいことがわかりました。その場合、多くのkryoオブジェクト間でマップを共有することは困難です.

0 投票する
1 に答える
729 参照

kryo - Kryo でのシリアル化イベント

シリアル化イベントをどのように受け取りますか? 定義できます

Javaシリアライゼーションでは、このメソッドはオブジェクトがシリアライズされるときに呼び出されます。Kryoで同じことをどのように行いますか? と の両方KryoSerializableExternalizableデフォルトのシリアル化の問題があります。イベント ハンドラーを呼び出すと、デフォルトの読み取り/書き込みオブジェクトが必要になります。しかし、そんなことはありません!? FieldSerializerinを呼び出しread(Kryo, Input)てオブジェクトのフィールドを読み取ることはできますが、現在のオブジェクトに値を設定する代わりに、新しいオブジェクトが生成されます。このため、カスタム シリアライザーを導入しようとしました。

ただし、A のサブクラスがserializationEvent()イベントを受け取ると、A.class フィールドのみがシリアル化されると述べました。したがって、これは では機能しませんclass B extends ANatan が提案した解決策も試しましたregister(A.class, new FieldSerializer(A.class, myhandler。これにより、サブクラスを含むすべてのフィールドがシリアル化されますが、カスタム シリアライザーはサブクラスに対してまったく呼び出されません。そのため、Kryo のカスタマイズは最終クラスでのみ機能することにしました。ネイサンは、この結論は「無効」であり、KryoSerializable ソリューションは「アプリケーション固有」であり、そうでなければ「失礼」だと考えています。そのような解決策にもかかわらず、私は発見した一般的な方法を公開することにしました.

0 投票する
1 に答える
3421 参照

java - Javaシリアル化、Kryoおよびオブジェクトグラフ

arrメモリ内にタイプのオブジェクトの配列がAあり、それぞれに同じオブジェクトを指す参照フィールドがあるとしますB

図:

タイプのすべてのオブジェクトの参照フィールドは、タイプの同じオブジェクトをA指していることに注意してください。B

arrここで、型のオブジェクトを含む配列をにシリアル化しAますObjectOutputStream。次に、この方法で取得したバイトを逆シリアル化します。

新しい配列を取得しarr1ます。

1)配列には、すべてが同じタイプのオブジェクトを指すようなarr1タイプのオブジェクトがありますか?(シリアル化前の同じオブジェクトを意味するのではなく、新しく作成された一意のタイプのオブジェクトを意味します)ABB

2)言い換えると、Javaでserialize / deserializeを呼び出すと、シリアル化前と同じオブジェクトグラフが保持されますか?(つまり、古いものと同型の新しく逆シリアル化されたオブジェクトグラフです)

3)これはどこに文書化されていますか?(つまり、引用を提供してください)

4)同じ質問1〜3ですが、JavaのKryoシリアル化フレームワークに適用されます。

ありがとうございました。

0 投票する
3 に答える
1104 参照

java - Kryo で「ファイルの終わり」を検出するにはどうすればよいですか?

Kryo の gzip ファイルから不明な数のオブジェクトを読み込んでいます:

問題は、ファイルから最後のオブジェクトを読み取ったことをどのように検出するかということです。オブジェクトを書き込んでいるときには、何を書き出すかが事前にわからないため、ファイルの先頭にオブジェクトの数を含めることはできません。

ファイルの最後に、それが最後のオブジェクトであることを示すために書き込むある種の「ダミー」オブジェクトを含めることもできますが、それは醜いようです。

0 投票する
5 に答える
4449 参照

java - Kryonetは接続直後に切断されます

私はKryonetの基本をカバーするこのYoutubeチュートリアルに従いました。

基本的にはKryonetHelloWorldであり、基本的なサーバーとクライアントをセットアップする方法を説明し、クライアントがサーバーにパケットを送信して非常に基本的な通信を行えるようにします。

ソースコードへのリンク。サーバーとクライアントの両方が同じパケットクラスを持っています。

サーバーを実行し、クライアントがIPに接続を要求するようにすることができます。ただし、IPを入力すると、接続直後にクライアントが終了します。

クライアント出力:

サーバーコマンドラインログ:

システムがTCP接続を閉じているようですが、よくわかりません。Kryonetの通信を許可するには、Windowsまたはルーターで何かを有効にする必要がありますか?

誰かが問題を見つけることができますか?前もって感謝します。

コマンドラインログにスペイン語で表示される行は、「既存の接続の中断がリモートホストによって強制されました」のようなものです。

user1816380のアドバイスの後に編集:

ほとんどの場合、それでも元のエラーが表示されますが、ときどき次のことがわかります。

0 投票する
2 に答える
10241 参照

java - kryoリストのシリアル化

Kryoを使用して、いくつかのオブジェクトのリストのリスト(カスタマイズされたクラスのリスト:List>)をシリアル化しようとしています。

これまでのところ問題なく、エラーなしでリストを書き出します。しかし、私がそれを読み込もうとすると:

このエラーが発生します:

どうすればこの問題を解決できますか?

0 投票する
1 に答える
2770 参照

java - Kryo でのオブジェクト配列のシリアライズとデシリアライズ

最近、シリアライゼーションとデシリアライゼーションのために Kryo をテストしており、概ね満足していますが、オブジェクト配列を含むクラスの (デ) シリアライゼーションを処理する方法が明確ではありません。クラスには final フィールドが含まれているため、デフォルトの FieldSerializer を使用できないようです (「クラスを作成できません (引数なしのコンストラクターがありません)」というエラーが表示されますが、引数なしのコンストラクターは final プリミティブには不適切です) )。だから、与えられたクラス

これを処理するシリアライザー/デシリアライザーを効率的に作成するにはどうすればよいでしょうか? 私の仮定では、com.esotericsoftware.kryo.io.Input に何かが欠けているため、カスタム シリアライザーでこれを行うことができますが、それは間違ったトラックである可能性があります..

0 投票する
2 に答える
3134 参照

java - Kryoはjava.sql.Timestampをシリアライズできませんか?

編集: Kryo 1.04の使用

私は今、Scala のフィールドUserを含むクラスをシリアライズしています。java.sql.Timestamp何らかの理由で、Kryo はゼロ引数のコンストラクターを見つけることができず、エラーをスローします。

これは、Riak のドメイン オブジェクトを変換するためのコンバーター クラスの一部です。ここに私のコンバータークラスがあります:

Timestamp を拡張して、ゼロ引数のコンストラクターを作成する必要がありますか? または、より良い回避策はありますか?

2.20 にアップグレードする必要がある場合ObjectBuffer、ファイルへの書き込みなしの代わりになるものは何ですか?

0 投票する
1 に答える
477 参照

java - RMI で Kryo を使用する方法

Kryo を使用して、RMI が使用するデフォルトの JVM シリアライゼーションを置き換えることができるかどうかについて多くの質問がありますが、実際に設定する方法については何もありません。Kryo は JVM シリアライゼーションの「ドロップイン」代替品であると聞いたことがありますが、それがランタイム クラスパスから一部の JAR を交換できることを意味するだけなのか (SLF4J バインディングなどの場合のように)、または何かを意味するのかどうかはわかりません。そうしないと。

Java に同梱されているデフォルトの JVM シリアライゼーションの代わりに、Kryo を使用して RMI を取得するにはどうすればよいでしょうか? 前もって感謝します!

0 投票する
0 に答える
2073 参照

java - 非常に大きなオブジェクトの Java シリアライゼーション

次の問題に直面しています: 非常に大きなオブジェクト (メモリ内に数百 MB) をファイルにシリアライズしたいと考えています。Kryo が最高のシリアル化ライブラリの 1 つであることを理解したので、これを使用してオブジェクトをシリアル化しています。

これにより、OutOfMemory 例外が生成されます。ファイルに書き込まれる前に、オブジェクト全体が最初にメモリ内でシリアル化されると思います。

したがって、私の質問:チャンクごとにファイルに書き込まれている間にオブジェクト全体をシリアル化する方法/ライブラリはありますか?

次のようにシリアル化する前に、オブジェクトをより小さな要素に分解するという回避策を避けたいと思います。

  • シリアライゼーションの実装をデータ オブジェクト構造から独立させたい
  • 私のオブジェクトには、同じオブジェクトへの複数の参照が含まれています。これらの要素を個別にシリアル化すると、シリアライザーはそれらを別のオブジェクトとしてインスタンス化します (さらに多くのメモリを消費します)。

更新: その間、非常に大きなオブジェクトのさまざまな要素が 1 つずつシリアル化されるシリアル化アプローチを実装しました。これにより、OutOfMemory 例外が実際に回避されます。

ただし、このアプローチでは、同じオブジェクトへの複数の参照の利点 (メモリ フットプリントの観点から) が失われるのではないかと心配しています (つまり、これらの参照はオブジェクトの独自のインスタンスを持つことになります)。これについて何か考えはありますか?

新しいコード スニペット (たとえば、field1 には field2 と同じオブジェクトへの参照が含まれています):

ヒント/ヘルプをいただければ幸いです。ありがとう、トム