in src/Serialization/SerializableType.cs [697:754]
protected override void Initialize(ByteBuffer buffer, byte formatCode,
out int size, out int count, out int encodeWidth, out CollectionType effectiveType)
{
if (formatCode != FormatCode.Described)
{
throw new AmqpException(ErrorCode.InvalidField, Fx.Format(SRAmqp.AmqpInvalidFormatCode, formatCode, buffer.Offset));
}
effectiveType = null;
formatCode = Encoder.ReadFormatCode(buffer);
ulong? code = null;
Symbol symbol = default(Symbol);
if (formatCode == FormatCode.ULong0)
{
code = 0;
}
else if (formatCode == FormatCode.ULong || formatCode == FormatCode.SmallULong)
{
code = Encoder.ReadULong(buffer, formatCode);
}
else if (formatCode == FormatCode.Symbol8 || formatCode == FormatCode.Symbol32)
{
symbol = Encoder.ReadSymbol(buffer, formatCode);
}
if (this.AreEqual(this.descriptorCode, this.descriptorName, code, symbol))
{
effectiveType = this;
}
else if (this.knownTypes != null)
{
for (int i = 0; i < this.knownTypes.Length; ++i)
{
SerializableType knownType = this.knownTypes[i];
if (!knownType.IsResolved)
{
knownType = this.serializer.GetType(knownType.type);
this.knownTypes[i] = knownType;
}
DescribedCompoundType describedKnownType = (DescribedCompoundType)knownType;
if (this.AreEqual(describedKnownType.descriptorCode, describedKnownType.descriptorName, code, symbol))
{
effectiveType = describedKnownType;
break;
}
}
}
if (effectiveType == null)
{
throw new AmqpException(ErrorCode.DecodeError,
Fx.Format(SRAmqp.AmqpUnknownDescriptor, code != null ? code.ToString() : symbol.ToString(), this.type.Name));
}
formatCode = Encoder.ReadFormatCode(buffer);
ReadSizeAndCount(buffer, formatCode, out size, out count, out encodeWidth);
}