ObjectManager Класс

Определение

Отслеживает объекты при их десериализации.Keeps track of objects as they are deserialized.

public ref class ObjectManager
public class ObjectManager
[System.Runtime.InteropServices.ComVisible(true)]
public class ObjectManager
type ObjectManager = class
Public Class ObjectManager
Наследование
ObjectManager
Атрибуты

Примеры

В следующем примере кода показано, как использовать класс ObjectManager для прохода по графу объектов, проходя к каждому объекту только один раз.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

Комментарии

Во время десериализации Formatter запрашивает ObjectManager, чтобы определить, ссылается ли ссылка на объект в сериализованном потоке на объект, который уже был десериализован (обратная ссылка), или на объект, который еще не был десериализован (ссылка вперед).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). Если ссылка в сериализованном потоке является прямой ссылкой, то Formatter может зарегистрировать исправление с ObjectManager.If the reference in the serialized stream is a forward reference, then the Formatter can register a fixup with the ObjectManager. Если ссылка в сериализованном потоке является обратной ссылкой, Formatter немедленно завершает ссылку.If the reference in the serialized stream is a backward reference, the Formatter immediately completes the reference. Адресная привязка относится к процессу завершения ссылок на объекты, которые еще не были выполнены в процессе десериализации объекта.Fixup refers to the process of finalizing object references not already completed during the object deserialization process. После десериализации требуемого объекта ObjectManager завершит ссылку.After the required object has been deserialized, the ObjectManager will complete the reference.

ObjectManager соответствует набору правил, определяющих порядок исправления.The ObjectManager follows a set of rules that dictate the fixup order. Все объекты, реализующие ISerializable или имеющие ISerializationSurrogate, могут рассчитывать все объекты, передаваемые через SerializationInfo, доступные при десериализации дерева объектов.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. Однако родительский объект не может предположить, что все его дочерние объекты будут полностью завершены при полной десериализации.However, a parent object cannot presume that all its child objects will be fully completed when it is fully deserialized. Все дочерние объекты будут представлены, но не все объекты внучатый будут присутствовать.All child objects will be present but not all the grandchild objects will necessarily be present. Если объекту необходимо выполнить определенные действия, зависящие от выполнения кода на его дочерних объектах, это может замедлить эти действия, реализовать интерфейс IDeserializationCallback и выполнить код только при обратном вызове этого интерфейса.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.

Конструкторы

ObjectManager(ISurrogateSelector, StreamingContext)

Инициализирует новый экземпляр класса ObjectManager.Initializes a new instance of the ObjectManager class.

Методы

DoFixups()

Выполняет все записанные адресные привязки.Performs all the recorded fixups.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Унаследовано от Object)
GetHashCode()

Служит в качестве хэш-функции по умолчанию.Serves as the default hash function.

(Унаследовано от Object)
GetObject(Int64)

Возвращает объект с заданным идентификатором объекта.Returns the object with the specified object ID.

GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Унаследовано от Object)
RaiseDeserializationEvent()

Вызывает событие десериализации для любого зарегистрированного объекта, который реализует IDeserializationCallback.Raises the deserialization event to any registered object that implements IDeserializationCallback.

RaiseOnDeserializingEvent(Object)

Вызывает метод, помеченный OnDeserializingAttribute.Invokes the method marked with the OnDeserializingAttribute.

RecordArrayElementFixup(Int64, Int32, Int64)

Записывает адресную привязку одного элемента в массив.Records a fixup for one element in an array.

RecordArrayElementFixup(Int64, Int32[], Int64)

Записывает адресные привязки заданных элементов в массив, который будет выполнен позже.Records fixups for the specified elements in an array, to be executed later.

RecordDelayedFixup(Int64, String, Int64)

Записывает адресную привязку для элемента объекта, который будет выполнен позже.Records a fixup for an object member, to be executed later.

RecordFixup(Int64, MemberInfo, Int64)

Записывает адресную привязку для элемента объекта, который будет выполнен позже.Records a fixup for a member of an object, to be executed later.

RegisterObject(Object, Int64)

Регистрирует объект при его десериализации, сопоставляя его с objectID.Registers an object as it is deserialized, associating it with objectID.

RegisterObject(Object, Int64, SerializationInfo)

Регистрирует объект при его десериализации, сопоставляя его с objectID и записывая используемый с ним SerializationInfo.Registers an object as it is deserialized, associating it with objectID, and recording the SerializationInfo used with it.

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

Регистрирует элемент объекта при его десериализации, сопоставляя его с objectID и записывая SerializationInfo.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[])

Регистрирует элемент массива, содержащийся в объекте при его десериализации, сопоставляя его с objectID и записывая SerializationInfo.Registers a member of an array contained in an object while it is deserialized, associating it with objectID, and recording the SerializationInfo.

ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Унаследовано от Object)

Применяется к