ObjectManager Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Håller reda på objekt när de deserialiseras.
public ref class ObjectManager
public class ObjectManager
[System.Runtime.InteropServices.ComVisible(true)]
public class ObjectManager
type ObjectManager = class
[<System.Runtime.InteropServices.ComVisible(true)>]
type ObjectManager = class
Public Class ObjectManager
- Arv
-
ObjectManager
- Attribut
Exempel
I följande kodexempel visas hur du använder ObjectManager klassen för att gå igenom ett objektdiagram och endast bläddra till varje objekt en gång.
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
Kommentarer
Under deserialiseringen Formatter frågar sig frågan ObjectManager om en referens till ett objekt i den serialiserade dataströmmen refererar till ett objekt som redan har deserialiserats (en bakåtreferens) eller till ett objekt som ännu inte har deserialiserats (en framåtreferens). Om referensen i den serialiserade dataströmmen är en referens Formatter framåt kan du registrera en korrigering med ObjectManager. Om referensen i den serialiserade strömmen är en bakåtreferens slutför referensen Formatter omedelbart. Korrigering refererar till processen för att slutföra objektreferenser som inte redan har slutförts under objektdeserialiseringsprocessen. När det obligatoriska objektet har deserialiserats ObjectManager slutförs referensen.
Följer ObjectManager en uppsättning regler som dikterar korrigeringsordningen. Alla objekt som implementerar ISerializable eller har en ISerializationSurrogate kan förvänta sig att ha alla objekt som de överförs via SerializationInfo tillgängliga när objektträdet deserialiseras. Ett överordnat objekt kan dock inte förutsätta att alla underordnade objekt slutförs helt när det är helt deserialiserat. Alla underordnade objekt kommer att finnas men inte alla barnbarnsobjekt kommer nödvändigtvis att finnas. Om ett objekt behöver vidta vissa åtgärder som är beroende av att köra kod på dess underordnade objekt, kan det fördröja dessa åtgärder, implementera IDeserializationCallback gränssnittet och köra koden endast när den anropas tillbaka på det här gränssnittet.
Konstruktorer
| Name | Description |
|---|---|
| ObjectManager(ISurrogateSelector, StreamingContext) |
Initierar en ny instans av ObjectManager klassen. |
Metoder
| Name | Description |
|---|---|
| DoFixups() |
Utför alla inspelade korrigeringar. |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetObject(Int64) |
Returnerar objektet med det angivna objekt-ID:t. |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| RaiseDeserializationEvent() |
Genererar deserialiseringshändelsen till alla registrerade objekt som implementerar IDeserializationCallback. |
| RaiseOnDeserializingEvent(Object) |
Anropar metoden som är markerad med OnDeserializingAttribute. |
| RecordArrayElementFixup(Int64, Int32, Int64) |
Registrerar en korrigering för ett element i en matris. |
| RecordArrayElementFixup(Int64, Int32[], Int64) |
Registrerar korrigeringar för de angivna elementen i en matris som ska köras senare. |
| RecordDelayedFixup(Int64, String, Int64) |
Registrerar en korrigering för en objektmedlem som ska köras senare. |
| RecordFixup(Int64, MemberInfo, Int64) |
Registrerar en korrigering för en medlem i ett objekt som ska köras senare. |
| RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo, Int32[]) |
Registrerar en medlem i en matris som finns i ett objekt medan den deserialiseras, associerar den med |
| RegisterObject(Object, Int64, SerializationInfo, Int64, MemberInfo) |
Registrerar en medlem i ett objekt eftersom det deserialiseras, associerar det med |
| RegisterObject(Object, Int64, SerializationInfo) |
Registrerar ett objekt eftersom det deserialiseras, associerar det med |
| RegisterObject(Object, Int64) |
Registrerar ett objekt eftersom det deserialiseras och associerar det med |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |