in src/Serialization/AmqpSerializer.cs [185:269]
SerializableType CreateContractType(AmqpContract contract, HashSet<Type> pendingTypes)
{
Type type = contract.Type;
if (pendingTypes.Contains(type))
{
return SerializableType.CreateDelegatingType(this, type);
}
pendingTypes.Add(type);
string descriptorName = contract.Attribute.Name;
ulong? descriptorCode = contract.Attribute.InternalCode;
if (descriptorName == null && descriptorCode == null)
{
descriptorName = type.FullName;
}
SerializableMember[] members = new SerializableMember[contract.Members.Length];
for (int i = 0; i < contract.Members.Length; i++)
{
SerializableMember member = new SerializableMember();
members[i] = member;
AmqpMember amqpMember = contract.Members[i];
member.Name = amqpMember.Name;
member.Order = amqpMember.Order;
member.Accessor = MemberAccessor.Create(amqpMember.Info, true);
// This will recursively resolve member types
Type memberType = amqpMember.Info is FieldInfo ?
((FieldInfo)amqpMember.Info).FieldType :
((PropertyInfo)amqpMember.Info).PropertyType;
member.Type = GetOrCompileType(memberType, false, pendingTypes);
}
MethodAccessor[] serializationCallbacks = new MethodAccessor[]
{
contract.Serializing == null ? null : MethodAccessor.Create(contract.Serializing),
contract.Serialized == null ? null : MethodAccessor.Create(contract.Serialized),
contract.Deserializing == null ? null : MethodAccessor.Create(contract.Deserializing),
contract.Deserialized == null ? null : MethodAccessor.Create(contract.Deserialized)
};
SerializableType baseType = null;
if (contract.BaseContract != null)
{
baseType = this.CreateContractType(contract.BaseContract, pendingTypes);
}
SerializableType[] knownTypes = null;
if (contract.Provides != null)
{
knownTypes = new SerializableType[contract.Provides.Length];
for (int i = 0; i < contract.Provides.Length; i++)
{
knownTypes[i] = this.GetOrCompileType(contract.Provides[i], true, pendingTypes);
}
}
SerializableType result;
if (contract.Attribute.Encoding == EncodingType.List)
{
result = SerializableType.CreateDescribedListType(this, type, baseType, descriptorName,
descriptorCode, members, knownTypes, serializationCallbacks);
}
else if (contract.Attribute.Encoding == EncodingType.Map)
{
result = SerializableType.CreateDescribedMapType(this, type, baseType, descriptorName,
descriptorCode, members, knownTypes, serializationCallbacks);
}
else if (contract.Attribute.Encoding == EncodingType.SimpleMap)
{
result = SerializableType.CreateDescribedSimpleMapType(this, type, baseType, members, serializationCallbacks);
}
else if (contract.Attribute.Encoding == EncodingType.SimpleList)
{
result = SerializableType.CreateDescribedSimpleListType(this, type, baseType, members, serializationCallbacks);
}
else
{
throw new NotSupportedException(contract.Attribute.Encoding.ToString());
}
pendingTypes.Remove(type);
return result;
}