ObjectManager 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
개체가 역직렬화될 때 추적합니다.
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
- 상속
-
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
설명
역직렬화하는 Formatter 동안 직렬화된 스트림의 개체에 대한 참조가 이미 역직렬화된 개체(뒤로 참조)를 참조하는지 또는 아직 역직렬화되지 않은 개체(정방향 참조)를 참조하는지 여부를 확인하기 위해 쿼리 ObjectManager 합니다. 직렬화된 스트림의 참조가 정방향 참조 Formatter 인 경우 수정을 .에 등록할 ObjectManager수 있습니다. 직렬화된 스트림의 참조가 뒤로 참조인 경우 참조가 Formatter 즉시 완료됩니다. 수정은 개체 역직렬화 프로세스 중에 아직 완료되지 않은 개체 참조를 마무리하는 프로세스를 나타냅니다. 필수 개체가 역직렬화되면 참조가 ObjectManager 완료됩니다.
수정 ObjectManager 순서를 지정하는 규칙 집합을 따릅니다. 구현 ISerializable 하거나 포함하는 모든 개체에는 ISerializationSurrogate 개체 트리가 역직렬화될 SerializationInfo 때 사용할 수 있는 모든 개체가 있을 것으로 예상할 수 있습니다. 그러나 부모 개체는 완전히 역직렬화될 때 모든 자식 개체가 완전히 완료될 것이라고 가정할 수 없습니다. 모든 자식 개체가 존재하지만 모든 손자 개체가 반드시 있는 것은 아닙니다. 개체가 자식 개체에서 코드를 실행하는 데 의존하는 특정 작업을 수행해야 하는 경우 이러한 작업을 지연시키고, 인터페이스를 IDeserializationCallback 구현하고, 이 인터페이스에서 다시 호출되는 경우에만 코드를 실행할 수 있습니다.
생성자
| ObjectManager(ISurrogateSelector, StreamingContext) |
ObjectManager 클래스의 새 인스턴스를 초기화합니다. |