public object Read(Format format, FormatReader reader) { MapDefinition definition = lazyDefinition.Value; if (format.IsMapFamily) { object obj = Activator.CreateInstance(definition.Type); InvokeCallback <OnDeserializingAttribute>(obj, definition); int size = reader.ReadMapLength(format); while (size > 0) { string name = (string)nameHandler.Read(reader.ReadFormat(), reader); name = nameConverter.OnUnpack(name, definition); if (definition.FieldHandlers.ContainsKey(name)) { object value = definition.FieldHandlers[name].Read(reader.ReadFormat(), reader); definition.FieldInfos[name].SetValue(obj, value); } else if (context.MapOptions.IgnoreUnknownFieldOnUnpack) { reader.Skip(); } else { throw new MissingFieldException(name + " does not exist for type: " + definition.Type); } size = size - 1; } InvokeCallback <OnDeserializedAttribute>(obj, definition); return(obj); } if (format.IsEmptyArray && context.MapOptions.AllowEmptyArrayOnUnpack) { return(Activator.CreateInstance(definition.Type)); } if (format.IsNil) { return(null); } throw new FormatException(this, format, reader); }