support TL bare vectors

This commit is contained in:
Wizou 2021-09-24 12:29:04 +02:00
parent be4d1aca6b
commit c570f3d8d0

View file

@ -154,14 +154,26 @@ namespace TL
internal static Array ReadTLVector(this BinaryReader reader, Type type) internal static Array ReadTLVector(this BinaryReader reader, Type type)
{ {
var ctorNb = reader.ReadUInt32();
if (ctorNb != Layer.VectorCtor) throw new ApplicationException($"Cannot deserialize {type.Name} with ctor #{ctorNb:x}");
var elementType = type.GetElementType(); var elementType = type.GetElementType();
int count = reader.ReadInt32(); uint ctorNb = reader.ReadUInt32();
Array array = (Array)Activator.CreateInstance(type, count); if (ctorNb == Layer.VectorCtor)
for (int i = 0; i < count; i++) {
array.SetValue(reader.ReadTLValue(elementType), i); int count = reader.ReadInt32();
return array; Array array = (Array)Activator.CreateInstance(type, count);
for (int i = 0; i < count; i++)
array.SetValue(reader.ReadTLValue(elementType), i);
return array;
}
else if (ctorNb < 1024 && !elementType.IsAbstract && elementType.GetCustomAttribute<TLDefAttribute>() is TLDefAttribute attr)
{
int count = (int)ctorNb;
Array array = (Array)Activator.CreateInstance(type, count);
for (int i = 0; i < count; i++)
array.SetValue(reader.ReadTLObject(attr.CtorNb), i);
return array;
}
else
throw new ApplicationException($"Cannot deserialize {type.Name} with ctor #{ctorNb:x}");
} }
internal static void WriteTLStamp(this BinaryWriter writer, DateTime datetime) internal static void WriteTLStamp(this BinaryWriter writer, DateTime datetime)