Поделиться через


ObjectManager Класс

Определение

Внимание!

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

Отслеживает объекты при их десериализации.

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
Наследование
ObjectManager
Атрибуты

Примеры

В следующем примере кода показано, как использовать ObjectManager класс для обхода графа объектов, обходя каждый объект только один раз.

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

Комментарии

Во время десериализации запрашивает ObjectManager , чтобы определить, Formatter ссылается ли ссылка на объект в сериализованном потоке на объект, который уже был десериализован (обратная ссылка), или на объект, который еще не был десериализован (прямая ссылка). Если ссылка в сериализованном потоке является ссылкой на прямую, то Formatter может зарегистрировать исправление с помощью ObjectManager. Если ссылка в сериализованном потоке является обратной ссылкой, Formatter объект немедленно завершает ссылку. Исправление относится к процессу завершения ссылок на объекты, еще не завершенным в процессе десериализации объекта. После десериализации ObjectManager требуемого объекта объект завершит ссылку.

Следует ObjectManager набору правил, которые определяют порядок исправления. Все объекты, которые реализуют ISerializable или имеют ISerializationSurrogate , могут ожидать, что все объекты, передаваемые через SerializationInfo , будут доступны при десериализации дерева объектов. Однако родительский объект не может предполагать, что все его дочерние объекты будут полностью завершены при полной десериализации. Все дочерние объекты будут присутствовать, но не все объекты внука обязательно будут присутствовать. Если объекту необходимо выполнить определенные действия, зависящие от выполнения кода на его дочерних объектах, он может отложить эти действия, реализовать IDeserializationCallback интерфейс и выполнить код только при обратном вызове в этом интерфейсе.

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

ObjectManager(ISurrogateSelector, StreamingContext)
Устаревшие..

Инициализирует новый экземпляр класса ObjectManager.

Методы

DoFixups()
Устаревшие..

Выполняет все записанные адресные привязки.

Equals(Object)
Устаревшие..

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()
Устаревшие..

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetObject(Int64)
Устаревшие..

Возвращает объект с заданным идентификатором объекта.

GetType()
Устаревшие..

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

(Унаследовано от Object)
MemberwiseClone()
Устаревшие..

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
RaiseDeserializationEvent()
Устаревшие..

Вызывает событие десериализации для любого зарегистрированного объекта, который реализует IDeserializationCallback.

RaiseOnDeserializingEvent(Object)
Устаревшие..

Вызывает метод, помеченный OnDeserializingAttribute.

RecordArrayElementFixup(Int64, Int32, Int64)
Устаревшие..

Записывает адресную привязку одного элемента в массив.

RecordArrayElementFixup(Int64, Int32[], Int64)
Устаревшие..

Записывает адресные привязки заданных элементов в массив, который будет выполнен позже.

RecordDelayedFixup(Int64, String, Int64)
Устаревшие..

Записывает адресную привязку для элемента объекта, который будет выполнен позже.

RecordFixup(Int64, MemberInfo, Int64)
Устаревшие..

Записывает адресную привязку для элемента объекта, который будет выполнен позже.

RegisterObject(Object, Int64)
Устаревшие..

Регистрирует объект при его десериализации, сопоставляя его с objectID.

RegisterObject(Object, Int64, SerializationInfo)
Устаревшие..

Регистрирует объект при его десериализации, сопоставляя его с objectID и записывая используемый с ним SerializationInfo.

RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo)
Устаревшие..

Регистрирует элемент объекта при его десериализации, сопоставляя его с objectID и записывая SerializationInfo.

RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo, Int32[])
Устаревшие..

Регистрирует элемент массива, содержащийся в объекте при его десериализации, сопоставляя его с objectID и записывая SerializationInfo.

ToString()
Устаревшие..

Возвращает строку, представляющую текущий объект.

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

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