public bool LoadData(ObjectManager manager, ISurrogateSelector selector, StreamingContext context)
{
if (Info != null) {
if (Surrogate != null) {
object new_obj = Surrogate.SetObjectData(ObjectInstance, Info, context, SurrogateSelector);
if (new_obj != null)
ObjectInstance = new_obj;
Status = ObjectRecordStatus.ReferenceSolved;
} else if (ObjectInstance is ISerializable) {
object[] pars = new object[] { Info, context };
ConstructorInfo con = FindConstructor();
if (con == null) throw new SerializationException("The constructor to deserialize an object of type " + ObjectInstance.GetType().FullName + " was not found.");
con.Invoke(ObjectInstance, pars);
} else {
throw new SerializationException("No surrogate selector was found for type " + ObjectInstance.GetType().FullName);
}
Info = null;
}
if (ObjectInstance is IObjectReference && Status != ObjectRecordStatus.ReferenceSolved) {
try {
ObjectInstance = ((IObjectReference)ObjectInstance).GetRealObject(context);
int n = 100;
while (ObjectInstance is IObjectReference && n > 0) {
object ob = ((IObjectReference)ObjectInstance).GetRealObject(context);
if (ob == ObjectInstance)
break;
ObjectInstance = ob;
n--;
}
if (n == 0)
throw new SerializationException("The implementation of the IObjectReference interface returns too many nested references to other objects that implement IObjectReference.");
Status = ObjectRecordStatus.ReferenceSolved;
} catch (NullReferenceException) {
// Give a second chance
return false;
}
}
if (Member != null) {
// If this object is a value object embedded in another object, the parent
// object must be updated
ObjectRecord containerRecord = manager.GetObjectRecord(IdOfContainingObj);
containerRecord.SetMemberValue(manager, Member, ObjectInstance);
} else if (ArrayIndex != null) {
ObjectRecord containerRecord = manager.GetObjectRecord(IdOfContainingObj);
containerRecord.SetArrayValue(manager, ObjectInstance, ArrayIndex);
}
return true;
}