public IDescriptorSerializerContext StoreNewDescriptors(AbstractBufferedWriter writer, object obj)
{
if (obj == null)
{
return(this);
}
InfoForType infoForType;
var iKnowDescriptor = obj as IKnowDescriptor;
if (iKnowDescriptor != null)
{
var descriptor = iKnowDescriptor.GetDescriptor();
if (!_typeOrDescriptor2InfoMap.TryGetValue(descriptor, out infoForType) &&
!_typeSerializersMapping._typeOrDescriptor2Info.TryGetValue(descriptor, out infoForType))
{
infoForType = new InfoForType {
Id = 0, Descriptor = descriptor
};
}
}
else
{
var objType = obj.GetType();
if (!_typeOrDescriptor2InfoMap.TryGetValue(objType, out infoForType) &&
!_typeSerializersMapping._typeOrDescriptor2Info.TryGetValue(objType, out infoForType))
{
var descriptor = _typeSerializers.DescriptorOf(objType);
if (_typeOrDescriptor2InfoMap.TryGetValue(descriptor, out infoForType))
{
_typeOrDescriptor2InfoMap[objType] = infoForType;
}
else if (_typeSerializersMapping._typeOrDescriptor2Info.TryGetValue(descriptor, out infoForType))
{
_typeSerializersMapping._typeOrDescriptor2Info[objType] = infoForType;
}
else
{
infoForType = new InfoForType {
Id = 0, Descriptor = descriptor
};
}
}
}
if (infoForType.Id == 0)
{
AddDescriptor(infoForType);
}
if (!infoForType.KnownNewTypeDiscoverer)
{
infoForType.NewTypeDiscoverer = _typeSerializers.GetNewDescriptorSaver(infoForType.Descriptor);
infoForType.KnownNewTypeDiscoverer = true;
}
var action = infoForType.NewTypeDiscoverer;
if (action != null)
{
action(obj, this);
}
return(this);
}