ObjectManager Classe

Definição

Cuidado

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

Monitora a desserialização de objetos.

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
Herança
ObjectManager
Atributos

Exemplos

O exemplo de código a seguir mostra como usar a ObjectManager classe para percorrer um grafo de objeto, percorrendo cada objeto apenas uma vez.

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

Comentários

Durante a desserialização, o Formatter consulta o ObjectManager para determinar se uma referência a um objeto no fluxo serializado se refere a um objeto que já foi desserializado (uma referência anterior) ou a um objeto que ainda não foi desserializado (uma referência de encaminhamento). Se a referência no fluxo serializado for uma referência de encaminhamento, o Formatter poderá registrar uma correção com o ObjectManager. Se a referência no fluxo serializado for uma referência anterior, o Formatter concluirá imediatamente a referência. A correção refere-se ao processo de finalização de referências de objeto ainda não concluídas durante o processo de desserialização do objeto. Depois que o objeto necessário tiver sido desserializado, o ObjectManager concluirá a referência.

O ObjectManager segue um conjunto de regras que ditam a ordem de correção. Todos os objetos que implementam ISerializable ou têm um ISerializationSurrogate podem esperar ter todos os objetos transmitidos por SerializationInfo eles disponíveis quando a árvore de objetos é desserializada. No entanto, um objeto pai não pode presumir que todos os seus objetos filho serão totalmente concluídos quando ele for totalmente desserializado. Todos os objetos filho estarão presentes, mas nem todos os objetos neto estarão necessariamente presentes. Se um objeto precisar executar determinadas ações que dependem da execução de código em seus objetos filho, ele poderá atrasar essas ações, implementar a IDeserializationCallback interface e executar o código somente quando ele for chamado novamente nessa interface.

Construtores

ObjectManager(ISurrogateSelector, StreamingContext)
Obsoleto.

Inicializa uma nova instância da classe ObjectManager.

Métodos

DoFixups()
Obsoleto.

Executa todas as correções gravadas.

Equals(Object)
Obsoleto.

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()
Obsoleto.

Serve como a função de hash padrão.

(Herdado de Object)
GetObject(Int64)
Obsoleto.

Retorna o objeto com a ID do objeto especificada.

GetType()
Obsoleto.

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()
Obsoleto.

Cria uma cópia superficial do Object atual.

(Herdado de Object)
RaiseDeserializationEvent()
Obsoleto.

Gera o evento de desserialização para qualquer objeto registrado que implementa IDeserializationCallback.

RaiseOnDeserializingEvent(Object)
Obsoleto.

Invoca o método marcado com OnDeserializingAttribute.

RecordArrayElementFixup(Int64, Int32, Int64)
Obsoleto.

Registra uma correção para um elemento em uma matriz.

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

Registra correções para os elementos especificados em uma matriz, a serem executados posteriormente.

RecordDelayedFixup(Int64, String, Int64)
Obsoleto.

Registra uma correção para um membro de objeto, a ser executado posteriormente.

RecordFixup(Int64, MemberInfo, Int64)
Obsoleto.

Registra uma correção para um membro de um objeto a ser executado posteriormente.

RegisterObject(Object, Int64)
Obsoleto.

Registra um objeto conforme ele é desserializado, associando-o a objectID.

RegisterObject(Object, Int64, SerializationInfo)
Obsoleto.

Registra um objeto conforme ele é desserializado, associando-o a objectID e gravando o SerializationInfo usado com ele.

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

Registra um membro de um objeto conforme ele é desserializado, associando-o a objectID e registrando o SerializationInfo.

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

Registra um membro de uma matriz contido em um objeto enquanto ele é desserializado, associando-o a objectID e registrando o SerializationInfo.

ToString()
Obsoleto.

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Aplica-se a