Evaluar y enviar comentarios
Contraer todo/Expandir todo Contraer todo
Esta página es específica de
Microsoft Visual Studio 2005/.NET Framework 2.0

Hay además otras versiones disponibles para:
Biblioteca de clases de .NET Framework
ObjectManager (Clase)

Realiza el seguimiento de los objetos a medida que se deserializan.

Espacio de nombres: System.Runtime.Serialization
Ensamblado: mscorlib (en mscorlib.dll)

Visual Basic (Declaración)
<ComVisibleAttribute(True)> _
Public Class ObjectManager
Visual Basic (Uso)
Dim instance As ObjectManager
C#
[ComVisibleAttribute(true)] 
public class ObjectManager
C++
[ComVisibleAttribute(true)] 
public ref class ObjectManager
J#
/** @attribute ComVisibleAttribute(true) */ 
public class ObjectManager
JScript
ComVisibleAttribute(true) 
public class ObjectManager

Durante la deserialización, Formatter consulta ObjectManager para determinar si una referencia a un objeto de la secuencia serializada es para un objeto ya deserializado (referencia atrasada) o para un objeto que todavía no se ha deserializado (referencia adelantada). Si la referencia de la secuencia serializada es una referencia adelantada, Formatter puede registrar una corrección con ObjectManager. Si la referencia de la secuencia serializada es una referencia atrasada, Formatter completa la referencia inmediatamente. La corrección es el proceso que finaliza las referencias a objetos que todavía no se han completado durante el proceso de deserialización del objeto. Una vez que el objeto requerido se ha deserializado, ObjectManager completa la referencia.

ObjectManager sigue un conjunto de reglas que marcan el orden de corrección. Todos los objetos que implementen ISerializable o tengan ISerializationSurrogate pueden esperar que todos los objetos transmitidos a través de SerializationInfo estén disponibles cuando el árbol de objetos se deserialice. No obstante, un objeto principal totalmente deserializado no puede dar por hecho que todos sus objetos secundarios se hayan completado totalmente. Todos los objetos secundarios estarán presentes, pero no necesariamente todos los objetos secundarios de éstos. Si un objeto necesita realizar ciertas acciones que dependen de la ejecución de código en sus objetos secundarios, puede retrasar estas acciones, implementar la interfaz IDeserializationCallback y ejecutar el código sólo cuando se le devuelva la llamada en esta interfaz.

En el ejemplo de código siguiente se muestra cómo utilizar la clase ObjectManager para pasar por un gráfico de objetos, pasando sólo una vez por cada objeto.

C#
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.Object
  System.Runtime.Serialization.ObjectManager
Los miembros estáticos públicos (Shared en Visual Basic) de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Windows 98, Windows 2000 SP4, Windows Millennium, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition

.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

.NET Framework

Compatible con: 2.0, 1.1, 1.0
Contenido de la comunidad   ¿Qué es Community Content?
Agregar contenido nuevo RSS  Anotaciones
Processing
© 2012 Microsoft. Reservados todos los derechos. Términos de uso | Marcas Registradas | Privacidad
Page view tracker