ObjectManager Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Upozornění
Formatter-based serialization is obsolete and should not be used.
Udržuje přehled o objektech při deserializaci.
public ref 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
public class ObjectManager
[System.Runtime.InteropServices.ComVisible(true)]
public class ObjectManager
[<System.Obsolete("Formatter-based serialization is obsolete and should not be used.", DiagnosticId="SYSLIB0050", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
type ObjectManager = class
type ObjectManager = class
[<System.Runtime.InteropServices.ComVisible(true)>]
type ObjectManager = class
Public Class ObjectManager
- Dědičnost
-
ObjectManager
- Atributy
Příklady
Následující příklad kódu ukazuje, jak pomocí ObjectManager třídy projít graf objektů, procházet do každého objektu pouze jednou.
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
Poznámky
Během deserializace dotazujeFormatter, ObjectManager zda odkaz na objekt v serializovaném datovém proudu odkazuje na objekt, který již byl deserializován (zpětný odkaz), nebo na objekt, který ještě nebyl deserializován (forward reference). Pokud je odkaz v serializovaném datovém proudu dopředný odkaz, Formatter může zaregistrovat opravu pomocí ObjectManager. Pokud je odkaz v serializovaném datovém proudu zpětným odkazem, Formatter okamžitě dokončí odkaz. Oprava odkazuje na proces finalizace odkazů na objekt, které ještě nebyly dokončeny během procesu deserializace objektu. Po deserializaci požadovaného objektu ObjectManager se dokončí odkaz.
Následuje ObjectManager sada pravidel, která určují pořadí oprav. Všechny objekty, které implementují ISerializable nebo mají ISerializationSurrogate , mohou očekávat, že budou mít všechny objekty, které byly přenášeny prostřednictvím SerializationInfo dostupné, když je strom objektu deserializován. Nadřazený objekt však nemůže předpokládat, že všechny jeho podřízené objekty budou plně dokončeny, když je plně deserializován. Všechny podřízené objekty budou přítomny, ale ne všechny vnoučata budou nutně přítomny. Pokud objekt potřebuje provést určité akce, které závisí na provádění kódu na podřízených objektech, může tyto akce zpozdit, implementovat IDeserializationCallback rozhraní a spustit kód pouze v případě, že je volána zpět v tomto rozhraní.
Konstruktory
| Name | Description |
|---|---|
| ObjectManager(ISurrogateSelector, StreamingContext) |
Zastaralé.
Inicializuje novou instanci ObjectManager třídy. |
Metody
| Name | Description |
|---|---|
| DoFixups() |
Zastaralé.
Provede všechny zaznamenané opravy. |
| Equals(Object) |
Zastaralé.
Určuje, zda je zadaný objekt roven aktuálnímu objektu. (Zděděno od Object) |
| GetHashCode() |
Zastaralé.
Slouží jako výchozí funkce hash. (Zděděno od Object) |
| GetObject(Int64) |
Zastaralé.
Vrátí objekt se zadaným ID objektu. |
| GetType() |
Zastaralé.
Získá Type aktuální instance. (Zděděno od Object) |
| MemberwiseClone() |
Zastaralé.
Vytvoří mělkou kopii aktuálního Object. (Zděděno od Object) |
| RaiseDeserializationEvent() |
Zastaralé.
Vyvolá deserializační událost na jakýkoli registrovaný objekt, který implementuje IDeserializationCallback. |
| RaiseOnDeserializingEvent(Object) |
Zastaralé.
Vyvolá metodu označenou značkou OnDeserializingAttribute. |
| RecordArrayElementFixup(Int64, Int32, Int64) |
Zastaralé.
Zaznamenává opravu pro jeden prvek v poli. |
| RecordArrayElementFixup(Int64, Int32[], Int64) |
Zastaralé.
Záznamy opravují zadané prvky v poli, které se mají provést později. |
| RecordDelayedFixup(Int64, String, Int64) |
Zastaralé.
Zaznamenává opravu člena objektu, který se má provést později. |
| RecordFixup(Int64, MemberInfo, Int64) |
Zastaralé.
Zaznamenává opravu člena objektu, který se má provést později. |
| RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo, Int32[]) |
Zastaralé.
Zaregistruje člena pole obsaženého v objektu, zatímco je deserializován, asociuje jej s |
| RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo) |
Zastaralé.
Zaregistruje člena objektu, protože je deserializován, asociuje ho s |
| RegisterObject(Object, Int64, SerializationInfo) |
Zastaralé.
Zaregistruje objekt jako deserializovaný, asociuje ho s |
| RegisterObject(Object, Int64) |
Zastaralé.
Zaregistruje objekt, protože je deserializován, asociuje ho s |
| ToString() |
Zastaralé.
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |