internal void WriteArray(MemberDefinition arrayDefn, Type elementType, System.Collections.IList list)
{
bool dataArea = arrayDefn.DataArea || (Writer == DataWriter);
AlignWrite();
switch (arrayDefn.Type)
{
case MemberType.ArrayOfReferences:
{
// Serializing as a struct member is nooooot a very good idea here.
// Debug.Assert(kind != SerializationKind.UserMember);
// Reference lists are always written to the data area
var oldWriter = Writer;
Writer = DataWriter;
StoreObjectOffset(list);
for (int i = 0; i < list.Count; i++)
{
WriteReference(list[i]);
GR2.QueueStructWrite(Type, dataArea, arrayDefn, elementType, list[i]);
}
Writer = oldWriter;
break;
}
case MemberType.ReferenceToArray:
case MemberType.ReferenceToVariantArray:
{
StoreObjectOffset(list);
if (arrayDefn.SerializationKind == SerializationKind.UserMember)
{
arrayDefn.Serializer.Write(this.GR2, this, arrayDefn, list);
}
else if (arrayDefn.SerializationKind == SerializationKind.UserElement)
{
for (int i = 0; i < list.Count; i++)
{
StoreObjectOffset(list[i]);
arrayDefn.Serializer.Write(this.GR2, this, arrayDefn, list[i]);
}
}
else
{
for (int i = 0; i < list.Count; i++)
{
WriteStruct(elementType, list[i], false);
}
}
GR2.FlushPendingWrites();
break;
}
default:
throw new ParsingException(String.Format("Unhandled array member type: {0}", arrayDefn.Type.ToString()));
}
}