internal object ReadInstance(MemberDefinition definition, object node, Type propertyType, object parent)
{
if (definition.SerializationKind == SerializationKind.UserRaw)
return definition.Serializer.Read(this, null, definition, 0, parent);
if (definition.ArraySize == 0)
{
return ReadElement(definition, node, propertyType, parent);
}
Type elementType = null;
if (propertyType != null)
{
if (definition.SerializationKind == SerializationKind.UserMember)
{
// Do unserialization directly on the whole array if per-member serialization was requested.
// This mode is a bit odd, as we resolve StructRef-s for non-arrays, but don't for array types.
StructDefinition defn = null;
if (definition.Definition.IsValid)
defn = definition.Definition.Resolve(this);
return definition.Serializer.Read(this, defn, definition, definition.ArraySize, parent);
}
else if (propertyType.IsArray)
{
// If the property is a native array (ie. SomeType[]), create an array instance and set its values
elementType = propertyType.GetElementType();
Array objs = Helpers.CreateArrayInstance(propertyType, (int)definition.ArraySize) as Array;
for (int i = 0; i < definition.ArraySize; i++)
{
objs.SetValue(ReadElement(definition, objs.GetValue(i), elementType, parent), i);
}
return objs;
}
else
{
// For non-native arrays we always assume the property is an IList<T>
if (node == null)
node = Helpers.CreateInstance(propertyType);
var items = node as System.Collections.IList;
var type = items.GetType().GetGenericArguments().Single();
for (int i = 0; i < definition.ArraySize; i++)
{
items.Add(ReadElement(definition, null, elementType, parent));
}
return items;
}
}
else
{
for (int i = 0; i < definition.ArraySize; i++)
ReadElement(definition, null, null, parent);
return null;
}
}