296 lines
8.5 KiB
C#
296 lines
8.5 KiB
C#
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;
|
|
}
|
|
}
|