Freigeben über


ObjectManager Klasse

Definition

Achtung

Formatter-based serialization is obsolete and should not be used.

Verfolgt Objekte während der Deserialisierung.

public ref class ObjectManager
public class ObjectManager
[System.Obsolete("Formatter-based serialization is obsolete and should not be used.", DiagnosticId="SYSLIB0050", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public class ObjectManager
[System.Runtime.InteropServices.ComVisible(true)]
public class ObjectManager
type ObjectManager = class
[<System.Obsolete("Formatter-based serialization is obsolete and should not be used.", DiagnosticId="SYSLIB0050", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
type ObjectManager = class
[<System.Runtime.InteropServices.ComVisible(true)>]
type ObjectManager = class
Public Class ObjectManager
Vererbung
ObjectManager
Attribute

Beispiele

Im folgenden Codebeispiel wird gezeigt, wie Sie die ObjectManager -Klasse verwenden, um ein Objektdiagramm zu durchlaufen, wobei die einzelnen Objekte nur einmal durchlaufen werden.

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 Deserialisierung fragt ObjectManager die Formatter ab, um zu bestimmen, ob sich ein Verweis auf ein Objekt im serialisierten Stream auf ein Objekt bezieht, das bereits deserialisiert wurde (ein Rückwärtsverweis) oder auf ein Objekt, das noch nicht deserialisiert wurde (ein Vorwärtsverweis). Wenn es sich bei dem Verweis im serialisierten Stream um einen Vorwärtsverweis handelt, kann ein Formatter Fixup mit dem registriert werden ObjectManager. Wenn der Verweis im serialisierten Stream ein Rückwärtsverweis ist, wird der Formatter Verweis sofort abgeschlossen. Fixup bezieht sich auf den Prozess des Abschließens von Objektverweisen, die während des Deserialisierungsprozesses nicht bereits abgeschlossen wurden. Nachdem das erforderliche Objekt deserialisiert wurde, wird der ObjectManager Verweis abgeschlossen.

Folgt ObjectManager einer Reihe von Regeln, die die Fixupreihenfolge vorgeben. Alle Objekte, die implementieren ISerializable oder über eine ISerializationSurrogate verfügen, können davon ausgehen, dass alle Objekte, über die sie übertragen SerializationInfo werden, verfügbar sind, wenn die Objektstruktur deserialisiert wird. Ein übergeordnetes Objekt kann jedoch nicht davon ausgehen, dass alle untergeordneten Objekte vollständig abgeschlossen sind, wenn es vollständig deserialisiert ist. Alle untergeordneten Objekte sind vorhanden, aber nicht alle Enkelobjekte müssen vorhanden sein. Wenn ein Objekt bestimmte Aktionen ausführen muss, die von der Ausführung von Code für seine untergeordneten Objekte abhängen, kann es diese Aktionen verzögern, die IDeserializationCallback Schnittstelle implementieren und den Code nur ausführen, wenn er auf dieser Schnittstelle wieder aufgerufen wird.

Konstruktoren

ObjectManager(ISurrogateSelector, StreamingContext)
Veraltet.

Initialisiert eine neue Instanz der ObjectManager-Klasse.

Methoden

DoFixups()
Veraltet.

Führt alle aufgezeichneten Fixups durch.

Equals(Object)
Veraltet.

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetHashCode()
Veraltet.

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetObject(Int64)
Veraltet.

Gibt das Objekt mit der angegebenen Objekt-ID zurück.

GetType()
Veraltet.

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()
Veraltet.

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
RaiseDeserializationEvent()
Veraltet.

Löst das Deserialisierungsereignis für ein beliebiges registriertes Objekt aus, das IDeserializationCallback implementiert.

RaiseOnDeserializingEvent(Object)
Veraltet.

Ruft die mit dem OnDeserializingAttribute markierte Methode auf.

RecordArrayElementFixup(Int64, Int32, Int64)
Veraltet.

Zeichnet ein Fixup für ein Element in einem Array auf.

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

Zeichnet Fixups für die angegebenen Elemente in einem Array auf, die später ausgeführt werden sollen.

RecordDelayedFixup(Int64, String, Int64)
Veraltet.

Zeichnet einen Fixup für einen Objektmember auf, der später ausgeführt werden soll.

RecordFixup(Int64, MemberInfo, Int64)
Veraltet.

Zeichnet einen Fixup für einen Member eines Objekts auf, der später ausgeführt werden soll.

RegisterObject(Object, Int64)
Veraltet.

Registriert ein Objekt, wenn es deserialisiert wird, und ordnet diesem eine objectID zu.

RegisterObject(Object, Int64, SerializationInfo)
Veraltet.

Registriert ein Objekt, wenn es deserialisiert wird, ordnet ihm dabei eine objectID zu und zeichnet die mit dem Objekt verwendete SerializationInfo auf.

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

Registriert einen Member eines Objekts, wenn es deserialisiert wird, ordnet ihm dabei eine objectID zu und zeichnet die SerializationInfo auf.

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

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.

ToString()
Veraltet.

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für: