ObjectManager Klas

Definitie

Houdt objecten bij terwijl ze gedeserialiseerd zijn.

public ref class ObjectManager
public class ObjectManager
[System.Runtime.InteropServices.ComVisible(true)]
public class ObjectManager
type ObjectManager = class
[<System.Runtime.InteropServices.ComVisible(true)>]
type ObjectManager = class
Public Class ObjectManager
Overname
ObjectManager
Kenmerken

Voorbeelden

In het volgende codevoorbeeld ziet u hoe u de ObjectManager klasse gebruikt om een objectgrafiek te doorlopen en slechts eenmaal naar elk object te gaan.

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

Opmerkingen

Tijdens de deserialisatie worden de Formatter query's uitgevoerd ObjectManager om te bepalen of een verwijzing naar een object in de geserialiseerde stroom verwijst naar een object dat al is gedeserialiseerd (een achterwaartse verwijzing) of naar een object dat nog niet is gedeserialiseerd (een doorstuurverwijzing). Als de verwijzing in de geserialiseerde stream een doorstuurverwijzing is, kan de Formatter verwijzing een fixup registreren bij de ObjectManager. Als de verwijzing in de geserialiseerde stroom een achterwaartse verwijzing is, wordt de Formatter verwijzing onmiddellijk voltooid. Fixup verwijst naar het proces van het voltooien van objectverwijzingen die nog niet zijn voltooid tijdens het deserialisatieproces van het object. Nadat het vereiste object is gedeserialiseerd, wordt de ObjectManager verwijzing voltooid.

Hier ObjectManager volgt een set regels waarmee de fixupvolgorde wordt bepaald. Alle objecten die een object implementeren ISerializable of hebben, ISerializationSurrogate kunnen verwachten dat alle objecten die ze hebben SerializationInfo verzonden, beschikbaar zijn wanneer de objectstructuur wordt gedeserialiseerd. Een bovenliggend object kan echter niet aannemen dat alle onderliggende objecten volledig worden voltooid wanneer het volledig gedeserialiseerd is. Alle onderliggende objecten zijn aanwezig, maar niet alle kleinkindobjecten zijn noodzakelijkerwijs aanwezig. Als een object bepaalde acties moet uitvoeren die afhankelijk zijn van het uitvoeren van code op de onderliggende objecten, kan het deze acties vertragen, de IDeserializationCallback interface implementeren en de code alleen uitvoeren wanneer deze wordt teruggeroepen op deze interface.

Constructors

Name Description
ObjectManager(ISurrogateSelector, StreamingContext)

Initialiseert een nieuw exemplaar van de ObjectManager klasse.

Methoden

Name Description
DoFixups()

Voert alle opgenomen fixups uit.

Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige object.

(Overgenomen van Object)
GetHashCode()

Fungeert als de standaardhashfunctie.

(Overgenomen van Object)
GetObject(Int64)

Retourneert het object met de opgegeven object-id.

GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
RaiseDeserializationEvent()

Hiermee wordt de deserialisatie-gebeurtenis gegenereerd voor elk geregistreerd object dat wordt geïmplementeerd IDeserializationCallback.

RaiseOnDeserializingEvent(Object)

Roept de methode aan die is gemarkeerd met de OnDeserializingAttribute.

RecordArrayElementFixup(Int64, Int32, Int64)

Registreert een fixup voor één element in een matrix.

RecordArrayElementFixup(Int64, Int32[], Int64)

Registreert fixups voor de opgegeven elementen in een matrix, die later moeten worden uitgevoerd.

RecordDelayedFixup(Int64, String, Int64)

Registreert een fixup voor een objectlid, die later moet worden uitgevoerd.

RecordFixup(Int64, MemberInfo, Int64)

Registreert een fixup voor een lid van een object, dat later moet worden uitgevoerd.

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

Registreert een lid van een matrix in een object terwijl het wordt gedeserialiseerd, gekoppeld aan objectIDen het opnemen van de SerializationInfo.

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

Registreert een lid van een object omdat het wordt gedeserialiseerd, gekoppeld aan objectIDen het opnemen van de SerializationInfo.

RegisterObject(Object, Int64, SerializationInfo)

Registreert een object omdat het gedeserialiseerd is, koppelt aan het objectIDobject en registreert het SerializationInfo gebruikte object.

RegisterObject(Object, Int64)

Registreert een object omdat het gedeserialiseerd is, waarbij het wordt gekoppeld aan objectID.

ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

(Overgenomen van Object)

Van toepassing op