問題タブ [ideserializationcallback]
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.
c# - Hashtable.OnDeserialization
Hashtableへの参照を維持し、そのHashtableをシリアライズ/デシリアライズするクラスがあります。SerializationInfo.GetValue の呼び出し後、IDeserialization のカルバック中に逆シリアル化が発生するため、Hashtable は完全には逆シリアル化されません。
親クラスに IDeserialization コールバックも実装しましたが、ハッシュテーブルもまだ完全に逆シリアル化されていません。逆シリアル化が裏返しに行われている場合は、そうなると予想していました。
私の質問は、親クラスの OnDeserialization メソッドから Hashtable.OnDeserialization を明示的に呼び出して、その時点で列挙できるようにしても安全ですか?
c# - IDeserializationCallback と OnDeserializedAttribute の比較
私が理解している限り、IDeserializationCallback インターフェイスと OnDeserialized イベントは、オブジェクトが逆シリアル化された後に何らかのタスクを実行する必要がある場合に使用できます。
IDeserializationCallback:
OnDeserialized イベント:
どちらかを選択する特定の長所/短所、またはシナリオはありますか?
.net - IDeserializationCallback インターフェイスの代わりに OnDeserializedAttribute を使用できますか?
MSDN がここで述べているように、可能です。しかし、mscorlib コードを掘り下げるのに 2 時間を費やしました。場合によっては、BinaryFormatter が OnDeserialized BEFORE デシリアライゼーション コンストラクターでマークされたメソッドを呼び出したからです。つまり、注文は
そうなることを期待しながら
そして最後のポイント。IDeserializationCallback インターフェイスを実装したとき、そのメソッド OnDeserialization は、私が望んでいて期待したとおり、AFTER コンストラクターと呼ばれていました。
これをいくつかの単純なクラス構造で再現しようとしましたが、すべてうまくいきました。私たちのプロジェクトでは、シリアル化されているオブジェクト グラフが非常に複雑なので、どこを掘ればよいかわかりません。mscorlib コードをリフレクターで調べてもあまり役に立ちませんでした。逆シリアル化コードが複雑すぎて、問題の原因を突き止めることができませんでした。
それで、誰がそのような問題を引き起こしているのか知っていますか? OnDeserialized が他のいくつかの場所でコンストラクターの前に呼び出されるという前提を使用しているため、信頼性が低いのではないかと心配しています...
ありがとう!
c# - IDeserializationCallback.OnDeserialization(Object sender):これはシンタックスシュガーですか?
ここから、IDeserializationCallback
インターフェースの使用例。
しかし、このメソッドシグネチャは私にはなじみがないように見えます。この.
表記は、ここで何か「トリッキー」なことが起こっていると私に思わせます。
ここで何が起こっているのですか?
.net - 奇妙な逆シリアル化エラー、子オブジェクトが完全に逆シリアル化されていません
バイナリシリアル化の奇妙な動作に気づきました。クラスの辞書を逆シリアル化し、すぐに何かを追加しようとすると、完全に初期化されていないため、エラーが発生します。
ディクショナリにデータを追加する行で、を取得しますNullReferenceException
が、Dict
プロパティはnullではありません。インスタンス化されますが初期化されません(すべてのフィールドが0またはnullです)。で作成されただけでFormatterServices.GetUninitializedObject
、実際にはまだ逆シリアル化されていないのではないかと思います。
この時点で、おそらく完全に初期化されていないことを理解しています。IDeserializationCallback
そこで、インターフェイスを実装することで、別のアプローチを試しました。MSDNによると:
オブジェクトグラフの逆シリアル化が完了したときに呼び出されるメソッドのサポートの一部として、現在のインターフェイスを実装します。
オブジェクトが子オブジェクトでコードを実行する必要がある場合、このアクションを遅らせ、IDeserializationCallbackを実装し、このインターフェイスでコールバックされたときにのみコードを実行できます。
だから、まさに私が必要としているようで、OnDeserialization
呼び出されたときに辞書が完全に初期化されることを期待していました...しかし、同じエラーが発生します!
は子オブジェクトでコードを実行するように設計されているためIDeserializationCallback
、この時点で子オブジェクトは完全に初期化されると思います。辞書を手動で呼び出すとOnDeserialize
正常に機能しますが、どういうわけか私はそれを行うことになっていないことに注意してください...
この動作は正常ですか?誰かがここで何が起こっているのか説明できますか?