問題タブ [iserializable]
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# - ISerializable を使用した循環参照によるイベントのシリアル化
一連のオブジェクトのシリアル化に対処する必要があります。簡単にするために、[Serializable]
属性をバイナリ シリアライザとバイナリ フォーマッタと一緒に使用し[NonSerialized]
、ほとんどのもので不要なフィールドを除外しています。より複雑な部分については、ISerializable
インターフェイス + デシリアライズ コンストラクターを実装しました。これは、循環参照 (通常のオブジェクト参照の形式) がある場合でも、非常にうまく機能します。
今、私は少し混乱する何かにぶつかりました。B
を実装しISerializable
、別のクラス (名前を付けます) によって参照されているContainer
クラスがそのクラスのイベントをサブスクライブすると、シリアライズ時に のGetObjectData
-Method がB
正確に 2 回呼び出されます。
したがって、このコード例は次のように記述します
循環効果の問題については、スタックオーバーフローか何かを期待していたでしょう:-)。それにもかかわらず、良くありません。もちろん、この例の回避策は、逆シリアル化コンストラクターにイベントを再度追加することです。しかし、私はこれを引き起こした原因を突き止めたいと思います。
最後に 1 つ: 上記のラムダ式の参照を次のように変更すると (フィールドではなくパラメーターを参照する)...
... シリアライゼーションは、初回実行直後にSerializationException
( B+<>c__DisplayClass2 is not mark as SerializableGetObjectData
) でクラッシュします。
理由のヒント (および有用な回避策) を歓迎します。
c# - GetObjectData メソッドが virtual とマークされていないクラスを拡張するときのシリアル化
フレームワークを拡張しようとしています。私が拡張しているクラスの 1 つがシリアル化されています。基本クラスのGetObjectData()
メソッドは仮想としてマークされていないため、オーバーライドできません。
オブジェクトが基本クラスとして参照されたときにシリアル化された場合、それはポリモーフィックではないため、基本クラスのみGetObjectData
が呼び出されます。
基本クラスを変更しGetObjectData
て仮想としてマークすることなく、これを回避する方法はありますか?
[編集] クラスを拡張し、シリアライズしたい属性を追加しました。以下の問題の簡単な例
保存/読み込みを実行すると、次のエラーが発生します。
SerializationException: No element named m_child could be found.
c# - 再帰的な子を持つ ISerializable
同様の型付けされた子のリストを含む C# クラスに ISerializable を実装したいと思います。次の例を検討してください。
上記のサンプルでは、Nested.GetObjectData と Nested のシリアライザー コンストラクターが 4 回、次々に呼び出されます。
ネストされた配列として子をシリアライザーに追加すると、デシリアライズ時に正しいサイズの配列が返されますが、すべての要素が null になります。
ただし、ネストされた配列からネストされたリストにタイプを変更すると、子のコンストラクターが呼び出された後に null 要素が魔法のように修正されます。
私が知りたいのは:
- ネストされたリストの特別な点は何ですか?
- このような再帰構造を持つクラスをシリアライズするための推奨される方法は何ですか?
アップデート:
逆シリアル化が行われた後に呼び出される追加のインターフェイス、IDeserializationCallback.OnDeserialization があるようです (呼び出し順序は非決定論的です)。逆シリアル化された配列をコンストラクターの一時メンバー変数に格納し、このメソッドでリストに割り当てることができます。何かが欠けていない限り、実装を一時変数で混乱させる必要があるため、これは理想的とは言えません。
c# - 基本クラスからのカスタム ISerializable
セッションを SQLServer に保持しようとしています。オブジェクトをシリアル化する必要があるよりも、SQL に格納する必要があるかどうかはわかっています。また、必要に応じてすべてのクラスに [Serializable] 属性を設定する必要があることも知っています。しかし、問題は、2000 を超えるオブジェクトがあり、増え続けていることです。それらは非常に緊密に結合されています。それらの 1 つをセッションに配置した場合、おそらく [Serializable] 属性をすべてに追加する必要がありますが、これは無意味です。私が知りたいのは、[Serializable] 属性が基本クラスで行うのと同じように、ISerializable インターフェイスに同じコードを記述する方法です。何か案が?または、すべてのクラスに [Serializable] を追加する必要があります。もしそうなら、何か欠点はありますか?
serialization - ISerializable オブジェクトを SOAP、Json、または Xml にシリアル化する方法
ISerializable である複雑なオブジェクトがあり、それを XML ドキュメントにシリアル化したい (ソース コードを変更せず、XML シリアル化属性を追加したくないノード)。ISerializable は BinaryFormatter で問題なく動作しますが、XML または Json にシリアル化する標準的な方法はありません。Json.NET ライブラリは、ISerializable オブジェクトを json にシリアライズすることをサポートしていますが、その実装には非常に小さな問題があり、Json.net がそれを検出するには、クラスのシリアライズ可能なコンストラクタを public にする必要があります (この問題を参照) 。これにより、私の場合はJson.netが使用できなくなります。
ISerializable オブジェクトを xml、Json、またはその他のプレーン テキスト形式との間でシリアライズ/デシリアライズする他の方法はありますか?
c# - インターフェイスのリストを使用したクラスの C# カスタム シリアル化
以下のように構築された ClassToSerialize をシリアライズおよびデシリアライズする方法を見つけようとしています:
クラスは API に渡され、デシリアライズ時に Foo1 と Foo2 のインスタンスを再構築して「Foo」プロパティに配置し、チェーンを下って IList< IFoo > または同様のオブジェクトに配置する必要があります。
私はこれに1日かそこらこだわっていて、アイデアがありません!