問題タブ [cyclic-reference]
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.
php - オブジェクトに循環依存関係を保存することは悪い習慣ですか、またはパフォーマンスの問題を被る可能性がありますか?
循環参照を持つことは悪い習慣ですか、それともパフォーマンスに重大な影響を与えますか? たとえば、オブジェクト A をオブジェクト B のプロパティとして追加し、次にオブジェクト B をオブジェクト A のプロパティとして追加しますか?
例:
この答えは似ているようですが、C#の場合です。
php - PHP 5.5 にアップグレードした後のシリアライゼーションの奇妙な問題、最大循環参照深度?
PHP メモリ内に循環参照でいっぱいのかなり大きなグラフがあります。グラフ全体をシリアル化して、リクエストの間に保存していました。PHP5.3 では問題なく動作しましたが、PHP5.5 にアップグレードしたところ、奇妙なことが起こっています。
PHP / Apache がシリアル化中に突然クラッシュ/終了し、ChromeERR_CONNECTION_RESET
が表示される PHP ログにエラーはなく、デバッグ モードの Apache ログにも何もありません。
かなりのデバッグを行った後、グラフを少し小さくしても機能することに気付きました。ただし、データを少しずつ元に戻すと、再導入すると失敗する非常に特定のポイントがあります。その特定のポイントをスキップして、代わりに他のデータを導入しても、続行できます。
メモリの問題ではない
私は非常に高いメモリ制限を設定しました: memory_limit = 2048M
、クラッシュするデータを導入する直前に、memory_get_usage()
26M とmemory_get_peak_usage()
41M を与えるので、十分に残っています。
時間の問題ではない
タイムアウト設定の範囲内であるため、おそらく時間に関連するものではなく、クラッシュすると、実際には、最後の作業シリアライゼーションを完了するのにかかった時間よりも早くクラッシュします。
循環参照/ループが多すぎますか?
クラッシュの原因となる私が紹介するデータは、オブジェクトに関して特別なことは何もしません。これはすべて同じ種類の PHP オブジェクトです (簡単にするためにノードとエッジを使用しています)。また、私が紹介するオブジェクトを直接取り巻く関係は、私に奇妙なことを何も教えてくれません。私が考えていることの1つは、シリアライズアルゴリズムがすべてのオブジェクトの変更を通過する方法で「問題のある」データが導入されると、トラバーサルパスが変更され、何かがクラッシュする原因になるということです.
他の上限?
私が考えることができるもう1つのことは、私が到達している他の上限があるということです. つまり、クラッシュを引き起こさずに元に戻すことができない「問題のある」データを見つけたら、最初に他の部分をオフにすると、データを元に戻すことができます。したがって、それはデータをまったく指していないようです。しかし、どの制限ですか?絞り出すことができた文字列の最大長は 5.517.365 文字で、mb_strlen($string, '8bit')
. しかし、文字列が約 400 万文字になる場合があり、少し追加するとクラッシュします。それは、その小さなデータがグラフのより深い/より大きな部分をより早くシリアル化する原因となり、内部的に何かの同じ上限に達したことを意味する可能性がありますか?
serialize() はバッファや tmp ファイルのようなものを使用しますか? それとも、単に「プレーン メモリ」を使用する必要がありますか?
私がヒットしている可能性のある他の境界線はありますか?および/またはどの設定がそれを解決する可能性がありますか?
java - サードパーティ クラスでの Jackson 無限再帰の回避策
ジャクソンにプロパティを無視するようにプログラムで指示する方法はありますか? たとえば、名前で。
私の問題は、サードパーティのオブジェクトをシリアル化していることです。その中には、親子の循環依存関係があるものもあります。
コードを変更できないため、循環依存関係を解消する通常の方法はうまくいきません。
私はObjectMapper
andを使用していObjectWriter
ます:
そして、スニペットにあるシリアライゼーションの包含と可視性と同様に、それらが高度にカスタマイズ可能であることは知っていますが、次のようなことを達成する方法を見つけることができません
java - MapStruct で変換するときに循環参照を防止する
今日、MapStruct を使用して、プロジェクトのモデルから DTO へのコンバーターを作成し始めました。循環参照が自動的に処理されるかどうか疑問に思っていましたが、そうではないことが判明しました。
これは、テスト用に作成したコンバーターです。
これはテストです:
Notifica、Avvisinotifica、およびそれぞれのモデルは、セッターとゲッターを備えた単純な POJO であるため、コードを投稿する必要はないと思います (Notifica は Corrispondenza を拡張します)。
このコードは無限サイクルに入りますが、ここではそれほど驚くべきことではありません (ただし、これらの状況を処理できることを望んでいました)。そして、それを手動で処理するエレガントな方法を見つけることができると思いますが(参照オブジェクトを挿入するためにメソッドを使用することを考えていまし@MappingTarget
た)、循環参照を自動的に処理する方法をMapStructに伝える方法があるかどうか疑問に思っていました.
scala - より高次の種類の連鎖、可能性はありますか?
私は次のようなものを持っています:
この種の構造に対処するためのより良い方法はありますか? どういうわけか、私のアプローチではP
、直接の親レベルのみに制約するために使用できましたが、親の親を失ってしまった (など) ため、制約は可能な限りタイトではありません。すべてのコンテキストを失いたくない場合は、次のように変更する必要があります。
これは完全に実行不可能です。
私が試したアプローチはすべて、違法な循環参照につながりました。この問題の解決策はありますか?