ObjectManager Klasse

Definition

Verfolgt Objekte während der Deserialisierung.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
Vererbung
ObjectManager
Attribute

Beispiele

Im folgenden Codebeispiel wird gezeigt, wie die ObjectManager -Klasse verwendet wird, um ein Objekt Diagramm zu durchlaufen, wobei jedes Objekt nur einmal durchlaufen wird.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

Hinweise

Während der Formatter Deserialisierung wird vom ObjectManager abgefragt, um zu bestimmen, ob ein Verweis auf ein Objekt im serialisierten Stream auf ein Objekt verweist, das bereits deserialisiert wurde (ein abwärts Verweis), oder auf ein Objekt, das noch nicht deserialisiert (ein vorwärts Verweis).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). Wenn der Verweis im serialisierten Stream ein vorwärts Verweis ist, Formatter kann ein Fixup bei der ObjectManagerregistrieren.If the reference in the serialized stream is a forward reference, then the Formatter can register a fixup with the ObjectManager. Wenn der Verweis im serialisierten Stream ein abwärts Verweis ist, Formatter vervollständigt sofort den Verweis.If the reference in the serialized stream is a backward reference, the Formatter immediately completes the reference. Fixup bezieht sich auf den Prozess zum Abschließen von Objekt verweisen, die während des objektdeserialisierungsprozesses nicht bereits abgeschlossen wurden.Fixup refers to the process of finalizing object references not already completed during the object deserialization process. Nachdem das erforderliche Objekt deserialisiert wurde, ObjectManager wird der Verweis von abgeschlossen.After the required object has been deserialized, the ObjectManager will complete the reference.

Der ObjectManager befolgt eine Reihe von Regeln, die die fixupreihenfolge vorschreiben.The ObjectManager follows a set of rules that dictate the fixup order. Alle Objekte, die ISerializable eine ISerializationSurrogate implementieren oder haben, können davon ausgehen, dass alle SerializationInfo Objekte, die Sie übertragen haben, bei der Deserialisierung der Objektstruktur verfügbar sind.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. Ein übergeordnetes Objekt kann jedoch nicht davon ausgehen, dass alle untergeordneten Objekte vollständig abgeschlossen werden, wenn es vollständig deserialisiert ist.However, a parent object cannot presume that all its child objects will be fully completed when it is fully deserialized. Alle untergeordneten Objekte werden vorhanden sein, aber nicht alle untergeordneten Objekte sind notwendigerweise vorhanden.All child objects will be present but not all the grandchild objects will necessarily be present. Wenn ein Objekt bestimmte Aktionen ausführen muss, die von der Ausführung von Code auf seinen untergeordneten Objekten abhängen, können diese Aktionen verzögert, IDeserializationCallback die Schnittstelle implementiert und der Code nur ausgeführt werden, wenn er auf dieser Schnittstelle aufgerufen wird.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.

Konstruktoren

ObjectManager(ISurrogateSelector, StreamingContext)

Initialisiert eine neue Instanz der ObjectManager-Klasse.Initializes a new instance of the ObjectManager class.

Methoden

DoFixups()

Führt alle aufgezeichneten Fixups durch.Performs all the recorded fixups.

Equals(Object)

Ermittelt, ob das angegebene Objekt und das aktuelle Objekt gleich sind.Determines whether the specified object is equal to the current object.

(Geerbt von Object)
GetHashCode()

Dient als die Standard-HashfunktionServes as the default hash function.

(Geerbt von Object)
GetObject(Int64)

Gibt das Objekt mit der angegebenen Objekt-ID zurück.Returns the object with the specified object ID.

GetType()

Ruft den Type der aktuellen Instanz ab.Gets the Type of the current instance.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.Creates a shallow copy of the current Object.

(Geerbt von Object)
RaiseDeserializationEvent()

Löst das Deserialisierungsereignis für ein beliebiges registriertes Objekt aus, das IDeserializationCallback implementiert.Raises the deserialization event to any registered object that implements IDeserializationCallback.

RaiseOnDeserializingEvent(Object)

Ruft die mit dem OnDeserializingAttribute markierte Methode auf.Invokes the method marked with the OnDeserializingAttribute.

RecordArrayElementFixup(Int64, Int32, Int64)

Zeichnet ein Fixup für ein Element in einem Array auf.Records a fixup for one element in an array.

RecordArrayElementFixup(Int64, Int32[], Int64)

Zeichnet Fixups für die angegebenen Elemente in einem Array auf, die später ausgeführt werden sollen.Records fixups for the specified elements in an array, to be executed later.

RecordDelayedFixup(Int64, String, Int64)

Zeichnet einen Fixup für einen Objektmember auf, der später ausgeführt werden soll.Records a fixup for an object member, to be executed later.

RecordFixup(Int64, MemberInfo, Int64)

Zeichnet einen Fixup für einen Member eines Objekts auf, der später ausgeführt werden soll.Records a fixup for a member of an object, to be executed later.

RegisterObject(Object, Int64)

Registriert ein Objekt, wenn es deserialisiert wird, und ordnet diesem eine objectID zu.Registers an object as it is deserialized, associating it with objectID.

RegisterObject(Object, Int64, SerializationInfo)

Registriert ein Objekt, wenn es deserialisiert wird, ordnet ihm dabei eine objectID zu und zeichnet die mit dem Objekt verwendete SerializationInfo auf.Registers an object as it is deserialized, associating it with objectID, and recording the SerializationInfo used with it.

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

Registriert einen Member eines Objekts, wenn es deserialisiert wird, ordnet ihm dabei eine objectID zu und zeichnet die SerializationInfo auf.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[])

Registriert einen Member eines in einem Objekt enthaltenen Arrays während der Deserialisierung des Objekts, ordnet diesem dabei eine objectID zu und zeichnet die SerializationInfo auf.Registers a member of an array contained in an object while it is deserialized, associating it with objectID, and recording the SerializationInfo.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.Returns a string that represents the current object.

(Geerbt von Object)

Gilt für: