0

(vb.Net 4.0 を使用) グラフがかなり複雑なオブジェクトがあるとします。オブジェクトには、プロパティ、配列、その他のコレクション、独自のプロパティとコレクションを持つサブクラスなどがあります。オブジェクト グラフ全体を完全に走査し、すべてのインスタンスを見つけたいと考えています。特定のタイプ T の、これらのインスタンスに対して特定の操作を実行します。オブジェクト グラフの完全なトラバーサルを実行する防弾方法はありますか? 振り返りがあっても、これはエラーが発生しやすい難しい作業のようです。

バイナリ シリアライゼーションについて疑問に思っていたのは、それがどんなに複雑であっても、かなり堅牢な方法でオブジェクトを複製しているように見えるからです。シリアル化する代わりに、指定された型 T のすべてのサブオブジェクトへの参照のリストを返すように、その手法を変更する方法はありますか? しかし、それは純粋な憶測に過ぎません。私は実行可能な解決策を受け入れる用意があります。

4

1 に答える 1

0

おそらく最善ではないかもしれませんが、私は方法を考え出しました。私のオブジェクトのグラフはかなりネストされていて複雑だったので、バイナリ シリアライゼーションに頼ることにしました。私の (限られた) 経験では、最も完全で堅牢なグラフ トラバーサルを提供するからです。マイナス面は、バイナリのシリアル化がパフォーマンスに大きな影響を与える可能性があることですが、ベンチマーク後は、私の特定の状況の制限要因にはならないようです。

基本的に、型 T に ISerializable を実装してから、クラスに追加することでポストシリアル化を処理できます。

 Protected Sub New(ByVal info As System.Runtime.Serialization.SerializationInfo,
                           ByVal context As System.Runtime.Serialization.StreamingContext)

別の方法 (Iserializable を実装しない) は、"OnDeserialized" 属性を使用してシリアル化後のメソッドを作成することです。

とにかく、タイプ T インスタンスで実行したい操作を説明するために使用した、streamingContext オブジェクトに情報を入れることができます。したがって、基本的には、親オブジェクトをシリアル化します。これにより、タイプ T のすべてのサブオブジェクトが検索およびシリアル化されます。これにより、逆シリアル化時に任意のタスクを実行するようにコード化できます。以降は、シリアライズされたオブジェクトのみを扱います。

明らかに、シリアライゼーションは複雑になる可能性があり、この方法はすべての状況で機能するとは限りません。パフォーマンス面でもかなり洗練されていません。しかし、手間のかからない徹底的なオブジェクト グラフ トラバーサルが必要だったので、これで終わりです。

于 2012-01-20T21:48:16.410 に答える