public void RegisterObject(object obj, long objectID, SerializationInfo info, long idOfContainingObj, MemberInfo member, int[] arrayIndex)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
if (objectID <= 0L)
{
throw new ArgumentOutOfRangeException("objectID", Environment.GetResourceString("ArgumentOutOfRange_ObjectID"));
}
if (member != (MemberInfo)null && !(member is RuntimeFieldInfo) && !(member is SerializationFieldInfo))
{
throw new SerializationException(Environment.GetResourceString("Serialization_UnknownMemberInfo"));
}
ISerializationSurrogate surrogate = (ISerializationSurrogate)null;
if (this.m_selector != null)
{
ISurrogateSelector selector;
surrogate = this.m_selector.GetSurrogate(!this.CanCallGetType(obj) ? typeof(MarshalByRefObject) : obj.GetType(), this.m_context, out selector);
}
if (obj is IDeserializationCallback)
{
this.AddOnDeserialization(new DeserializationEventHandler(((IDeserializationCallback)obj).OnDeserialization));
}
if (arrayIndex != null)
{
arrayIndex = (int[])arrayIndex.Clone();
}
ObjectHolder objectHolder = this.FindObjectHolder(objectID);
if (objectHolder == null)
{
ObjectHolder holder = new ObjectHolder(obj, objectID, info, surrogate, idOfContainingObj, (FieldInfo)member, arrayIndex);
this.AddObjectHolder(holder);
if (holder.RequiresDelayedFixup)
{
this.SpecialFixupObjects.Add(holder);
}
this.AddOnDeserialized(obj);
}
else
{
if (objectHolder.ObjectValue != null)
{
throw new SerializationException(Environment.GetResourceString("Serialization_RegisterTwice"));
}
objectHolder.UpdateData(obj, info, surrogate, idOfContainingObj, (FieldInfo)member, arrayIndex, this);
if (objectHolder.DirectlyDependentObjects > 0)
{
this.CompleteObject(objectHolder, false);
}
if (objectHolder.RequiresDelayedFixup)
{
this.SpecialFixupObjects.Add(objectHolder);
}
if (objectHolder.CompletelyFixed)
{
this.DoNewlyRegisteredObjectFixups(objectHolder);
objectHolder.DependentObjects = (LongList)null;
}
if (objectHolder.TotalDependentObjects > 0)
{
this.AddOnDeserialized(obj);
}
else
{
this.RaiseOnDeserializedEvent(obj);
}
}
}