Share via


ObjectManager Kelas

Definisi

Perhatian

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

Melacak objek saat dideserialisasi.

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
Warisan
ObjectManager
Atribut

Contoh

Contoh kode berikut menunjukkan cara menggunakan ObjectManager kelas untuk menelusuri grafik objek, melintas ke setiap objek hanya sekali.

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

Keterangan

Selama deserialisasi, Formatter kueri ObjectManager untuk menentukan apakah referensi ke objek dalam aliran berseri mengacu pada objek yang telah dideserialisasi (referensi mundur), atau ke objek yang belum dideserialisasi (referensi maju). Jika referensi dalam aliran yang diserialisasikan adalah referensi penerusan, maka Formatter dapat mendaftarkan perbaikan dengan ObjectManager. Jika referensi dalam aliran yang diserialisasikan adalah referensi mundur, segera Formatter menyelesaikan referensi. Perbaikan mengacu pada proses menyelesaikan referensi objek yang belum selesai selama proses deserialisasi objek. Setelah objek yang diperlukan dideserialisasi, ObjectManager akan menyelesaikan referensi.

Berikut ObjectManager ini adalah seperangkat aturan yang menentukan urutan perbaikan. Semua objek yang mengimplementasikan ISerializable atau memiliki ISerializationSurrogate dapat mengharapkan untuk memiliki semua objek yang mereka kirimkan melalui SerializationInfo tersedia ketika pohon objek dideserialisasi. Namun, objek induk tidak dapat menganggap bahwa semua objek turunannya akan sepenuhnya selesai ketika sepenuhnya dideserialisasi. Semua objek anak akan hadir tetapi tidak semua objek cucu harus ada. Jika objek perlu mengambil tindakan tertentu yang bergantung pada eksekusi kode pada objek turunannya, objek dapat menunda tindakan ini, mengimplementasikan IDeserializationCallback antarmuka, dan menjalankan kode hanya ketika dipanggil kembali pada antarmuka ini.

Konstruktor

ObjectManager(ISurrogateSelector, StreamingContext)
Kedaluwarsa.

Menginisialisasi instans baru kelas ObjectManager.

Metode

DoFixups()
Kedaluwarsa.

Melakukan semua perbaikan yang direkam.

Equals(Object)
Kedaluwarsa.

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
GetHashCode()
Kedaluwarsa.

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetObject(Int64)
Kedaluwarsa.

Mengembalikan objek dengan ID objek yang ditentukan.

GetType()
Kedaluwarsa.

Mendapatkan instans Type saat ini.

(Diperoleh dari Object)
MemberwiseClone()
Kedaluwarsa.

Membuat salinan dangkal dari yang saat ini Object.

(Diperoleh dari Object)
RaiseDeserializationEvent()
Kedaluwarsa.

Menaikkan peristiwa deserialisasi ke objek terdaftar apa pun yang mengimplementasikan IDeserializationCallback.

RaiseOnDeserializingEvent(Object)
Kedaluwarsa.

Memanggil metode yang ditandai dengan OnDeserializingAttribute.

RecordArrayElementFixup(Int64, Int32, Int64)
Kedaluwarsa.

Merekam perbaikan untuk satu elemen dalam array.

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

Merekam perbaikan untuk elemen yang ditentukan dalam array, yang akan dijalankan nanti.

RecordDelayedFixup(Int64, String, Int64)
Kedaluwarsa.

Merekam perbaikan untuk anggota objek, yang akan dijalankan nanti.

RecordFixup(Int64, MemberInfo, Int64)
Kedaluwarsa.

Merekam perbaikan untuk anggota objek, yang akan dijalankan nanti.

RegisterObject(Object, Int64)
Kedaluwarsa.

Mendaftarkan objek saat dideserialisasi, mengaitkannya dengan objectID.

RegisterObject(Object, Int64, SerializationInfo)
Kedaluwarsa.

Mendaftarkan objek saat dideserialisasi, mengaitkannya dengan objectID, dan merekam yang SerializationInfo digunakan dengannya.

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

Mendaftarkan anggota objek saat dideserialisasi, mengaitkannya dengan objectID, dan merekam SerializationInfo.

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

Mendaftarkan anggota array yang terkandung dalam objek saat dideserialisasi, mengaitkannya dengan objectID, dan merekam SerializationInfo.

ToString()
Kedaluwarsa.

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Berlaku untuk