ObjectManager クラス
アセンブリ: mscorlib (mscorlib.dll 内)


逆シリアル化中に、Formatter は ObjectManager に照会して、シリアル化ストリームのオブジェクトへの参照が逆シリアル化済みのオブジェクトを参照しているのか (後方参照)、またはまだ逆シリアル化されていないオブジェクトを参照しているのか (前方参照) どうかを判断します。シリアル化ストリームの参照が前方参照である場合は、Formatter が ObjectManager によってフィックスアップを登録します。シリアル化ストリームの参照が後方参照である場合は、Formatter がすぐにその参照を完了します。フィックスアップとは、オブジェクトの逆シリアル化処理で、まだ完了していないオブジェクト参照を完了する処理を指します。要求したオブジェクトが逆シリアル化された後で、ObjectManager がその参照を完了します。
ObjectManager は、フィックスアップ順序を指示する一連の規則に従います。ISerializable を実装しているか、または ISerializationSurrogate を持っているすべてのオブジェクトは、オブジェクト ツリーが逆シリアル化されるときに使用できる SerializationInfo を使用して送信したオブジェクトをすべて持つことができます。ただし、親オブジェクトは、自らが完全に逆シリアル化されたときに、そのすべての子オブジェクトも完成されているとは仮定できません。すべての子オブジェクトは存在しますが、すべての孫オブジェクトが存在するとは限りません。オブジェクトがその子オブジェクトでのコードの実行に依存する、なんらかのアクションを実行する必要がある場合は、このアクションを延期し、IDeserializationCallback インターフェイスを実装して、このインターフェイスでコール バックされたときにだけコードを実行できます。

ObjectManager クラスを使用して、各オブジェクトを一度だけ走査しながら、オブジェクト グラフを順をおって調べていく方法を次のコード例に示します。
using System; using System.Text; using System.Collections; using System.Runtime.Serialization; using System.Reflection; // This class walks through all the objects once in an object graph. public sealed class ObjectWalker : IEnumerable, IEnumerator { private Object m_current; // This stack contains the set of objects that will be enumerated. private Stack m_toWalk = new Stack(); // The ObjectIDGenerator ensures that each object is enumerated just once. private ObjectIDGenerator m_idGen = new ObjectIDGenerator(); // Construct an ObjectWalker passing the root of the object graph. public ObjectWalker(Object root) { Schedule(root); } // Return an enumerator so this class can be used with foreach. public IEnumerator GetEnumerator() { return this; } // Resetting the enumerator is not supported. public void Reset() { throw new NotSupportedException("Resetting the enumerator is not supported."); } // Return the enumeration's current object. public Object Current { get { return m_current; } } // Walk the reference of the passed-in object. private void Schedule(Object toSchedule) { if (toSchedule == null) return; // Ask the ObjectIDManager if this object has been examined before. Boolean firstOccurrence; m_idGen.GetId(toSchedule, out firstOccurrence); // If this object has been examined before, do not look at it again just return. if (!firstOccurrence) return; if (toSchedule.GetType().IsArray) { // The object is an array, schedule each element of the array to be looked at. foreach (Object item in ((Array)toSchedule)) Schedule(item); } else { // The object is not an array, schedule this object to be looked at. m_toWalk.Push(toSchedule); } } // Advance to the next item in the enumeration. public Boolean MoveNext() { // If there are no more items to enumerate, return false. if (m_toWalk.Count == 0) return false; // Check if the object is a terminal object (has no fields that refer to other objects). if (!IsTerminalObject(m_current = m_toWalk.Pop())) { // The object does have field, schedule the object's instance fields to be enumerated. foreach (FieldInfo fi in m_current.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) { Schedule(fi.GetValue(m_current)); } } return true; } // Returns true if the object has no data fields with information of interest. private Boolean IsTerminalObject(Object data) { Type t = data.GetType(); return t.IsPrimitive || t.IsEnum || t.IsPointer || data is String; } } public sealed class App { // Define some fields in the class to test the ObjectWalker. public String name = "Fred"; public Int32 Age = 40; static void Main() { // Build an object graph using an array that refers to various objects. Object[] data = new Object[] { "Jeff", 123, 555L, (Byte) 35, new App() }; // Construct an ObjectWalker and pass it the root of the object graph. ObjectWalker ow = new ObjectWalker(data); // Enumerate all of the objects in the graph and count the number of objects. Int64 num = 0; foreach (Object o in ow) { // Display each object's type and value as a string. Console.WriteLine("Object #{0}: Type={1}, Value's string={2}", num++, o.GetType(), o.ToString()); } } } // This code produces the following output. // // Object #0: Type=App, Value's string=App // Object #1: Type=System.Int32, Value's string=40 // Object #2: Type=System.String, Value's string=Fred // Object #3: Type=System.Byte, Value's string=35 // Object #4: Type=System.Int64, Value's string=555 // Object #5: Type=System.Int32, Value's string=123 // Object #6: Type=System.String, Value's string=Jeff

System.Runtime.Serialization.ObjectManager


Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


ObjectManager コンストラクタ
アセンブリ: mscorlib (mscorlib.dll 内)

Dim selector As ISurrogateSelector Dim context As StreamingContext Dim instance As New ObjectManager(selector, context)



Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


ObjectManager メソッド

名前 | 説明 | |
---|---|---|
![]() | DoFixups | 記録されたすべてのフィックスアップを実行します。 |
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 ( Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 ( Object から継承されます。) |
![]() | GetObject | 指定したオブジェクト ID のオブジェクトを返します。 |
![]() | GetType | 現在のインスタンスの Type を取得します。 ( Object から継承されます。) |
![]() | RaiseDeserializationEvent | IDeserializationCallback を実装する任意の登録されたオブジェクトに逆シリアル化イベントを発生させます。 |
![]() | RaiseOnDeserializingEvent | OnDeserializingAttribute でマークされたメソッドを呼び出します。 |
![]() | RecordArrayElementFixup | オーバーロードされます。 後で実行するために、配列内の 1 つの要素に対するフィックスアップを記録します。 |
![]() | RecordDelayedFixup | 後で実行するために、オブジェクト メンバに対するフィックスアップを記録します。 |
![]() | RecordFixup | 後で実行するために、オブジェクトのメンバに対するフィックスアップを記録します。 |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 ( Object から継承されます。) |
![]() | RegisterObject | オーバーロードされます。 オブジェクトが逆シリアル化されたときに、そのオブジェクトを登録します。 |
![]() | ToString | 現在の Object を表す String を返します。 ( Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 ( Object から継承されます。) |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 ( Object から継承されます。) |

ObjectManager メンバ
ObjectManager データ型で公開されるメンバを以下の表に示します。


名前 | 説明 | |
---|---|---|
![]() | DoFixups | 記録されたすべてのフィックスアップを実行します。 |
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 (Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 (Object から継承されます。) |
![]() | GetObject | 指定したオブジェクト ID のオブジェクトを返します。 |
![]() | GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
![]() | RaiseDeserializationEvent | IDeserializationCallback を実装する任意の登録されたオブジェクトに逆シリアル化イベントを発生させます。 |
![]() | RaiseOnDeserializingEvent | OnDeserializingAttribute でマークされたメソッドを呼び出します。 |
![]() | RecordArrayElementFixup | オーバーロードされます。 後で実行するために、配列内の 1 つの要素に対するフィックスアップを記録します。 |
![]() | RecordDelayedFixup | 後で実行するために、オブジェクト メンバに対するフィックスアップを記録します。 |
![]() | RecordFixup | 後で実行するために、オブジェクトのメンバに対するフィックスアップを記録します。 |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 (Object から継承されます。) |
![]() | RegisterObject | オーバーロードされます。 オブジェクトが逆シリアル化されたときに、そのオブジェクトを登録します。 |
![]() | ToString | 現在の Object を表す String を返します。 (Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。) |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |

Object Manager
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/09 07:26 UTC 版)
「Windows NT系」の記事における「Object Manager」の解説
サブシステムとシステムコールがWindowsのリソースへのアクセスを管理する。
※この「Object Manager」の解説は、「Windows NT系」の解説の一部です。
「Object Manager」を含む「Windows NT系」の記事については、「Windows NT系」の概要を参照ください。
- Object Managerのページへのリンク