public void StoreObject(object obj)
{
if (_newTypeFound) return;
if (obj == null)
{
_writer.WriteUInt8(0);
return;
}
var visited = _visited;
for (int i = 0; i < visited.Count; i++)
{
if (visited[i] != obj) continue;
_writer.WriteUInt8(1); // backreference
_writer.WriteVUInt32((uint)i);
return;
}
visited.Add(obj);
SerializerTypeInfo info;
if (!_typeOrDescriptor2Info.TryGetValue(obj.GetType(), out info))
{
var knowDescriptor = obj as IKnowDescriptor;
if (knowDescriptor != null)
{
if (!_typeOrDescriptor2Info.TryGetValue(knowDescriptor.GetDescriptor(), out info))
{
_newTypeFound = true;
return;
}
}
else
{
_newTypeFound = true;
return;
}
}
if (info.ComplexSaver == null) info.ComplexSaver = BuildComplexSaver(info.Descriptor);
_writer.WriteVUInt32((uint)info.Id);
info.ComplexSaver(_writer, this, obj);
}