public void StoreNewDescriptors(object obj)
{
if (obj == null) return;
for (var i = 0; i < _visited.Count; i++)
{
if (_visited[i] == obj) return;
}
_visited.Add(obj);
SerializerTypeInfo info;
var knowDescriptor = obj as IKnowDescriptor;
if (knowDescriptor != null)
{
var origDesc = knowDescriptor.GetDescriptor();
if (!_typeOrDescriptor2Info.TryGetValue(origDesc, out info))
{
var newDesc = MergeDescriptor(origDesc);
if (!_typeOrDescriptor2Info.TryGetValue(newDesc, out info))
{
info = new SerializerTypeInfo
{
Id = 0,
Descriptor = newDesc
};
}
_typeOrDescriptor2InfoNew[origDesc] = info;
}
}
else
{
if (!_typeOrDescriptor2Info.TryGetValue(obj.GetType(), out info))
{
var desc = Create(obj.GetType());
info = _typeOrDescriptor2InfoNew[desc];
}
}
if (info.NestedObjGatherer == null)
{
info.NestedObjGatherer = BuildNestedObjGatherer(info.Descriptor, knowDescriptor == null ? obj.GetType() : null);
}
info.NestedObjGatherer(obj, this);
}