ObjectManager ObjectManager ObjectManager ObjectManager Class

定義

逆シリアル化されたオブジェクトを追跡します。Keeps track of objects as they are deserialized.

public ref class ObjectManager
[System.Runtime.InteropServices.ComVisible(true)]
public class ObjectManager
type ObjectManager = class
Public Class ObjectManager
継承
ObjectManagerObjectManagerObjectManagerObjectManager
属性

ObjectManagerクラスを使用してオブジェクトグラフを走査し、各オブジェクトを1回だけ走査する方法を次のコード例に示します。The following code example shows how to use the ObjectManager class to walk through an object graph, traversing to each object only once.

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

注釈

逆シリアル化Formatter中に、 ObjectManagerはにクエリを実行して、シリアル化ストリーム内のオブジェクトへの参照が、既に逆シリアル化されている (後方参照) オブジェクトを参照しているか、まだ存在していないオブジェクトを参照しているかを判断します。逆シリアル化 (前方参照)。During deserialization, the Formatter queries the ObjectManager to determine whether a reference to an object in the serialized stream refers to an object that has already been deserialized (a backward reference), or to an object that has not yet been deserialized (a forward reference). シリアル化されたストリーム内の参照が前方参照であるFormatter場合、はObjectManagerに修正を登録できます。If the reference in the serialized stream is a forward reference, then the Formatter can register a fixup with the ObjectManager. シリアル化されたストリーム内の参照が後方参照のFormatter場合、はすぐに参照を完了します。If the reference in the serialized stream is a backward reference, the Formatter immediately completes the reference. Fixup は、オブジェクトの逆シリアル化プロセス中に既に完了していないオブジェクト参照を終了するプロセスを指します。Fixup refers to the process of finalizing object references not already completed during the object deserialization process. 必要なオブジェクトが逆シリアル化ObjectManagerされると、によって参照が完了します。After the required object has been deserialized, the ObjectManager will complete the reference.

ObjectManager 、修正順序を決定する一連の規則に従います。The ObjectManager follows a set of rules that dictate the fixup order. を実装ISerializableする、またはをISerializationSurrogate持つすべてのオブジェクトは、オブジェクトツリーが逆シリアルSerializationInfo化されたときに、使用可能な経由で送信されるすべてのオブジェクトを持つことを期待できます。All objects that implement ISerializable or have a ISerializationSurrogate can expect to have all the objects that they transmitted through SerializationInfo available when the object tree is deserialized. ただし、親オブジェクトは、完全に逆シリアル化されると、すべての子オブジェクトが完全に完了するとは仮定できません。However, a parent object cannot presume that all its child objects will be fully completed when it is fully deserialized. すべての子オブジェクトが存在しますが、すべての孫オブジェクトが存在するとは限りません。All child objects will be present but not all the grandchild objects will necessarily be present. オブジェクトが子オブジェクトのコードの実行に依存する特定のアクションを実行する必要がある場合は、これらのアクションIDeserializationCallbackを遅延させ、インターフェイスを実装し、このインターフェイスでコールバックしたときにのみコードを実行できます。If an object needs to take certain actions that depend on executing code on its child objects, it can delay these actions, implement the IDeserializationCallback interface, and execute the code only when it is called back on this interface.

コンストラクター

ObjectManager(ISurrogateSelector, StreamingContext) ObjectManager(ISurrogateSelector, StreamingContext) ObjectManager(ISurrogateSelector, StreamingContext) ObjectManager(ISurrogateSelector, StreamingContext)

ObjectManager クラスの新しいインスタンスを初期化します。Initializes a new instance of the ObjectManager class.

メソッド

DoFixups() DoFixups() DoFixups() DoFixups()

記録されたすべてのフィックスアップを実行します。Performs all the recorded fixups.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(Inherited from Object)
GetObject(Int64) GetObject(Int64) GetObject(Int64) GetObject(Int64)

指定したオブジェクト ID のオブジェクトを返します。Returns the object with the specified object ID.

GetType() GetType() GetType() GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(Inherited from Object)
RaiseDeserializationEvent() RaiseDeserializationEvent() RaiseDeserializationEvent() RaiseDeserializationEvent()

IDeserializationCallback を実装する任意の登録されたオブジェクトに逆シリアル化イベントを発生させます。Raises the deserialization event to any registered object that implements IDeserializationCallback.

RaiseOnDeserializingEvent(Object) RaiseOnDeserializingEvent(Object) RaiseOnDeserializingEvent(Object) RaiseOnDeserializingEvent(Object)

OnDeserializingAttribute でマークされたメソッドを呼び出します。Invokes the method marked with the OnDeserializingAttribute.

RecordArrayElementFixup(Int64, Int32, Int64) RecordArrayElementFixup(Int64, Int32, Int64) RecordArrayElementFixup(Int64, Int32, Int64) RecordArrayElementFixup(Int64, Int32, Int64)

配列内の 1 つの要素に対するフィックスアップを記録します。Records a fixup for one element in an array.

RecordArrayElementFixup(Int64, Int32[], Int64) RecordArrayElementFixup(Int64, Int32[], Int64) RecordArrayElementFixup(Int64, Int32[], Int64) RecordArrayElementFixup(Int64, Int32[], Int64)

後で実行するために、配列内の指定した要素に対するフィックスアップを記録します。Records fixups for the specified elements in an array, to be executed later.

RecordDelayedFixup(Int64, String, Int64) RecordDelayedFixup(Int64, String, Int64) RecordDelayedFixup(Int64, String, Int64) RecordDelayedFixup(Int64, String, Int64)

後で実行するために、オブジェクト メンバーに対するフィックスアップを記録します。Records a fixup for an object member, to be executed later.

RecordFixup(Int64, MemberInfo, Int64) RecordFixup(Int64, MemberInfo, Int64) RecordFixup(Int64, MemberInfo, Int64) RecordFixup(Int64, MemberInfo, Int64)

後で実行するために、オブジェクトのメンバーに対するフィックスアップを記録します。Records a fixup for a member of an object, to be executed later.

RegisterObject(Object, Int64) RegisterObject(Object, Int64) RegisterObject(Object, Int64) RegisterObject(Object, Int64)

オブジェクトが逆シリアル化されたときに、そのオブジェクトを objectID に関連付けて登録します。Registers an object as it is deserialized, associating it with objectID.

RegisterObject(Object, Int64, SerializationInfo) RegisterObject(Object, Int64, SerializationInfo) RegisterObject(Object, Int64, SerializationInfo) RegisterObject(Object, Int64, SerializationInfo)

オブジェクトが逆シリアル化されたときに、そのオブジェクトを objectID に関連付けて登録し、そのオブジェクトと共に使用する SerializationInfo を記録します。Registers an object as it is deserialized, associating it with objectID, and recording the SerializationInfo used with it.

RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo) RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo) RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo) RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo)

オブジェクトが逆シリアル化されたときに、そのオブジェクトのメンバーを objectID に関連付けて登録し、SerializationInfo を記録します。Registers a member of an object as it is deserialized, associating it with objectID, and recording the SerializationInfo.

RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo, Int32[]) RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo, Int32[]) RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo, Int32[]) RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo, Int32[])

オブジェクトが逆シリアル化されているときに、そのオブジェクトに格納された配列のメンバーを objectID に関連付けて登録し、SerializationInfo を記録します。Registers a member of an array contained in an object while it is deserialized, associating it with objectID, and recording the SerializationInfo.

ToString() ToString() ToString() ToString()

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.

(Inherited from Object)

適用対象