internal void WriteDeferredReference(object o)
{
bool isNew;
var refId = identifier.GetId(o, out isNew);
writer.Write(refId);
if(isNew)
{
var method = writeMethods.surrogateObjectIfNeededMethodsProvider.GetOrCreate(o.GetType());
if(method != null)
{
o = method(this, o, refId);
}
// we should write a type reference here!
// and some special data in case of some types, i.e. surrogates or arrays
var type = o.GetType();
TouchAndWriteTypeId(type);
writeMethods.handleNewReferenceMethodsProvider.GetOrCreate(type)(this, o, refId);
}
}