using System; using System.Reflection; namespace System.Runtime.Serialization { // Token: 0x0200048A RID: 1162 internal class ObjectRecord { // Token: 0x06002C26 RID: 11302 RVA: 0x00091648 File Offset: 0x0008F848 public void SetMemberValue(ObjectManager manager, MemberInfo member, object value) { if (member is FieldInfo) { ((FieldInfo)member).SetValue(this.ObjectInstance, value); } else { if (!(member is PropertyInfo)) { throw new SerializationException("Cannot perform fixup"); } ((PropertyInfo)member).SetValue(this.ObjectInstance, value, null); } if (this.Member != null) { ObjectRecord objectRecord = manager.GetObjectRecord(this.IdOfContainingObj); if (objectRecord.IsRegistered) { objectRecord.SetMemberValue(manager, this.Member, this.ObjectInstance); } } else if (this.ArrayIndex != null) { ObjectRecord objectRecord2 = manager.GetObjectRecord(this.IdOfContainingObj); if (objectRecord2.IsRegistered) { objectRecord2.SetArrayValue(manager, this.ObjectInstance, this.ArrayIndex); } } } // Token: 0x06002C27 RID: 11303 RVA: 0x00091718 File Offset: 0x0008F918 public void SetArrayValue(ObjectManager manager, object value, int[] indices) { ((Array)this.ObjectInstance).SetValue(value, indices); } // Token: 0x06002C28 RID: 11304 RVA: 0x0009172C File Offset: 0x0008F92C public void SetMemberValue(ObjectManager manager, string memberName, object value) { if (this.Info == null) { throw new SerializationException("Cannot perform fixup"); } this.Info.AddValue(memberName, value, value.GetType()); } // Token: 0x1700089B RID: 2203 // (get) Token: 0x06002C29 RID: 11305 RVA: 0x00091758 File Offset: 0x0008F958 public bool IsInstanceReady { get { return this.IsRegistered && !this.IsUnsolvedObjectReference && (!this.ObjectInstance.GetType().IsValueType || (!this.HasPendingFixups && this.Info == null)); } } // Token: 0x1700089C RID: 2204 // (get) Token: 0x06002C2A RID: 11306 RVA: 0x000917B0 File Offset: 0x0008F9B0 public bool IsUnsolvedObjectReference { get { return this.Status != ObjectRecordStatus.ReferenceSolved; } } // Token: 0x1700089D RID: 2205 // (get) Token: 0x06002C2B RID: 11307 RVA: 0x000917C0 File Offset: 0x0008F9C0 public bool IsRegistered { get { return this.Status != ObjectRecordStatus.Unregistered; } } // Token: 0x06002C2C RID: 11308 RVA: 0x000917D0 File Offset: 0x0008F9D0 public bool DoFixups(bool asContainer, ObjectManager manager, bool strict) { BaseFixupRecord baseFixupRecord = null; BaseFixupRecord baseFixupRecord2 = ((!asContainer) ? this.FixupChainAsRequired : this.FixupChainAsContainer); bool flag = true; while (baseFixupRecord2 != null) { if (baseFixupRecord2.DoFixup(manager, strict)) { this.UnchainFixup(baseFixupRecord2, baseFixupRecord, asContainer); if (asContainer) { baseFixupRecord2.ObjectRequired.RemoveFixup(baseFixupRecord2, false); } else { baseFixupRecord2.ObjectToBeFixed.RemoveFixup(baseFixupRecord2, true); } } else { baseFixupRecord = baseFixupRecord2; flag = false; } baseFixupRecord2 = ((!asContainer) ? baseFixupRecord2.NextSameRequired : baseFixupRecord2.NextSameContainer); } return flag; } // Token: 0x06002C2D RID: 11309 RVA: 0x00091864 File Offset: 0x0008FA64 public void RemoveFixup(BaseFixupRecord fixupToRemove, bool asContainer) { BaseFixupRecord baseFixupRecord = null; for (BaseFixupRecord baseFixupRecord2 = ((!asContainer) ? this.FixupChainAsRequired : this.FixupChainAsContainer); baseFixupRecord2 != null; baseFixupRecord2 = ((!asContainer) ? baseFixupRecord2.NextSameRequired : baseFixupRecord2.NextSameContainer)) { if (baseFixupRecord2 == fixupToRemove) { this.UnchainFixup(baseFixupRecord2, baseFixupRecord, asContainer); return; } baseFixupRecord = baseFixupRecord2; } } // Token: 0x06002C2E RID: 11310 RVA: 0x000918C4 File Offset: 0x0008FAC4 private void UnchainFixup(BaseFixupRecord fixup, BaseFixupRecord prevFixup, bool asContainer) { if (prevFixup == null) { if (asContainer) { this.FixupChainAsContainer = fixup.NextSameContainer; } else { this.FixupChainAsRequired = fixup.NextSameRequired; } } else if (asContainer) { prevFixup.NextSameContainer = fixup.NextSameContainer; } else { prevFixup.NextSameRequired = fixup.NextSameRequired; } } // Token: 0x06002C2F RID: 11311 RVA: 0x00091924 File Offset: 0x0008FB24 public void ChainFixup(BaseFixupRecord fixup, bool asContainer) { if (asContainer) { fixup.NextSameContainer = this.FixupChainAsContainer; this.FixupChainAsContainer = fixup; } else { fixup.NextSameRequired = this.FixupChainAsRequired; this.FixupChainAsRequired = fixup; } } // Token: 0x06002C30 RID: 11312 RVA: 0x00091958 File Offset: 0x0008FB58 public bool LoadData(ObjectManager manager, ISurrogateSelector selector, StreamingContext context) { if (this.Info != null) { if (this.Surrogate != null) { object obj = this.Surrogate.SetObjectData(this.ObjectInstance, this.Info, context, this.SurrogateSelector); if (obj != null) { this.ObjectInstance = obj; } this.Status = ObjectRecordStatus.ReferenceSolved; } else { if (!(this.ObjectInstance is ISerializable)) { throw new SerializationException("No surrogate selector was found for type " + this.ObjectInstance.GetType().FullName); } object[] array = new object[] { this.Info, context }; ConstructorInfo constructor = this.ObjectInstance.GetType().GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(SerializationInfo), typeof(StreamingContext) }, null); if (constructor == null) { throw new SerializationException("The constructor to deserialize an object of type " + this.ObjectInstance.GetType().FullName + " was not found."); } constructor.Invoke(this.ObjectInstance, array); } this.Info = null; } if (this.ObjectInstance is IObjectReference && this.Status != ObjectRecordStatus.ReferenceSolved) { try { this.ObjectInstance = ((IObjectReference)this.ObjectInstance).GetRealObject(context); int num = 100; while (this.ObjectInstance is IObjectReference && num > 0) { object realObject = ((IObjectReference)this.ObjectInstance).GetRealObject(context); if (realObject == this.ObjectInstance) { break; } this.ObjectInstance = realObject; num--; } if (num == 0) { throw new SerializationException("The implementation of the IObjectReference interface returns too many nested references to other objects that implement IObjectReference."); } this.Status = ObjectRecordStatus.ReferenceSolved; } catch (NullReferenceException) { return false; } } if (this.Member != null) { ObjectRecord objectRecord = manager.GetObjectRecord(this.IdOfContainingObj); objectRecord.SetMemberValue(manager, this.Member, this.ObjectInstance); } else if (this.ArrayIndex != null) { ObjectRecord objectRecord2 = manager.GetObjectRecord(this.IdOfContainingObj); objectRecord2.SetArrayValue(manager, this.ObjectInstance, this.ArrayIndex); } return true; } // Token: 0x1700089E RID: 2206 // (get) Token: 0x06002C31 RID: 11313 RVA: 0x00091BA4 File Offset: 0x0008FDA4 public bool HasPendingFixups { get { return this.FixupChainAsContainer != null; } } // Token: 0x04001119 RID: 4377 public ObjectRecordStatus Status; // Token: 0x0400111A RID: 4378 public object OriginalObject; // Token: 0x0400111B RID: 4379 public object ObjectInstance; // Token: 0x0400111C RID: 4380 public long ObjectID; // Token: 0x0400111D RID: 4381 public SerializationInfo Info; // Token: 0x0400111E RID: 4382 public long IdOfContainingObj; // Token: 0x0400111F RID: 4383 public ISerializationSurrogate Surrogate; // Token: 0x04001120 RID: 4384 public ISurrogateSelector SurrogateSelector; // Token: 0x04001121 RID: 4385 public MemberInfo Member; // Token: 0x04001122 RID: 4386 public int[] ArrayIndex; // Token: 0x04001123 RID: 4387 public BaseFixupRecord FixupChainAsContainer; // Token: 0x04001124 RID: 4388 public BaseFixupRecord FixupChainAsRequired; // Token: 0x04001125 RID: 4389 public ObjectRecord Next; } }