ObjectManager Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Przestroga
Formatter-based serialization is obsolete and should not be used.
Śledzi obiekty w miarę ich deserializacji.
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
- Dziedziczenie
-
ObjectManager
- Atrybuty
Przykłady
W poniższym przykładzie kodu pokazano, jak używać ObjectManager klasy do przechodzenia przez graf obiektu, przechodząc do każdego obiektu tylko raz.
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
Uwagi
Podczas deserializacji kwerenda FormatterObjectManager określa, czy odwołanie do obiektu w serializowanym strumieniu odwołuje się do obiektu, który został już deserializowany (odwołanie do tyłu) lub do obiektu, który nie został jeszcze deserializowany (odwołanie do przodu). Jeśli odwołanie w serializowanym strumieniu jest odwołaniem do przodu, można Formatter zarejestrować poprawkę za pomocą polecenia ObjectManager. Jeśli odwołanie w strumieniu serializowanym jest odwołaniem do tyłu, Formatter natychmiast kończy odwołanie. Poprawka odnosi się do procesu finalizowania odwołań do obiektów, które nie zostały jeszcze ukończone podczas procesu deserializacji obiektu. Po deserializacji ObjectManager wymaganego obiektu element zakończy odwołanie.
Poniżej ObjectManager przedstawiono zestaw reguł, które określają kolejność naprawy. Wszystkie obiekty, które implementują ISerializable lub mają ISerializationSurrogate obiekt, mogą oczekiwać, że wszystkie obiekty przesyłane przez SerializationInfo nie są dostępne, gdy drzewo obiektów jest deserializowane. Jednak obiekt nadrzędny nie może zakładać, że wszystkie jego obiekty podrzędne zostaną w pełni ukończone, gdy jest w pełni deserializacji. Wszystkie obiekty podrzędne będą obecne, ale nie wszystkie obiekty wnuków muszą być obecne. Jeśli obiekt musi wykonać określone akcje, które zależą od wykonywania kodu względem jego obiektów podrzędnych, może opóźnić te akcje, zaimplementować IDeserializationCallback interfejs i wykonać kod tylko wtedy, gdy jest wywoływany z powrotem w tym interfejsie.
Konstruktory
ObjectManager(ISurrogateSelector, StreamingContext) |
Przestarzałe.
Inicjuje nowe wystąpienie klasy ObjectManager. |
Metody
DoFixups() |
Przestarzałe.
Wykonuje wszystkie zarejestrowane poprawki. |
Equals(Object) |
Przestarzałe.
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
GetHashCode() |
Przestarzałe.
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetObject(Int64) |
Przestarzałe.
Zwraca obiekt o określonym identyfikatorze obiektu. |
GetType() |
Przestarzałe.
Type Pobiera bieżące wystąpienie. (Odziedziczone po Object) |
MemberwiseClone() |
Przestarzałe.
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
RaiseDeserializationEvent() |
Przestarzałe.
Zgłasza zdarzenie deserializacji do dowolnego zarejestrowanego obiektu, który implementuje IDeserializationCallbackelement . |
RaiseOnDeserializingEvent(Object) |
Przestarzałe.
Wywołuje metodę oznaczoną za pomocą metody OnDeserializingAttribute. |
RecordArrayElementFixup(Int64, Int32, Int64) |
Przestarzałe.
Rejestruje poprawkę dla jednego elementu w tablicy. |
RecordArrayElementFixup(Int64, Int32[], Int64) |
Przestarzałe.
Rejestruje poprawki dla określonych elementów w tablicy, które mają zostać wykonane później. |
RecordDelayedFixup(Int64, String, Int64) |
Przestarzałe.
Rejestruje poprawkę dla elementu członkowskiego obiektu, który ma zostać wykonany później. |
RecordFixup(Int64, MemberInfo, Int64) |
Przestarzałe.
Rejestruje poprawkę dla elementu członkowskiego obiektu, który ma zostać wykonany później. |
RegisterObject(Object, Int64) |
Przestarzałe.
Rejestruje obiekt, ponieważ jest deserializowany, kojarząc go z obiektem |
RegisterObject(Object, Int64, SerializationInfo) |
Przestarzałe.
Rejestruje obiekt, gdy jest deserializowany, kojarząc go z elementem |
RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo) |
Przestarzałe.
Rejestruje element członkowski obiektu, ponieważ jest deserializowany, kojarząc go z elementem |
RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo, Int32[]) |
Przestarzałe.
Rejestruje element członkowski tablicy zawartej w obiekcie, gdy jest deserializowany, kojarząc go z elementem |
ToString() |
Przestarzałe.
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |