public void WriteObject(object o)
{
if(o == null || Helpers.IsTransient(o.GetType()))
{
throw new ArgumentException("Cannot write a null object or a transient object.");
}
if(referencePreservation != ReferencePreservation.Preserve)
{
identifier = identifierContext == null ? new ObjectIdentifier() : new ObjectIdentifier(identifierContext);
identifierContext = null;
}
try
{
var writtenBefore = identifier.Count;
writeMethods.writeReferenceMethodsProvider.GetOrCreate(typeof(object))(this, o);
if(writtenBefore != identifier.Count)
{
var refId = identifier.GetId(o);
do
{
if(!objectsWrittenInline.Contains(refId))
{
var obj = identifier.GetObject(refId);
writer.Write(refId);
InvokeCallbacksAndExecute(obj, WriteObjectInner);
}
refId++;
}
while(identifier.Count > refId);
}
}
finally
{
for(var i = identifier.Count - 1; i >= 0; i--)
{
Completed(identifier.GetObject(i));
}
foreach(var postHook in postSerializationHooks)
{
postHook();
}
PrepareForNextWrite();
}
}