public <T> T deserialize(Class<? extends T> clazz, Map<String,String> row){
		try{
			Map<Field,ColumnSerializer> serializers = getConfiguration(clazz);
			Constructor c = clazz.getDeclaredConstructor();
			c.setAccessible(true);
			T object = (T)c.newInstance();
			for(Entry<Field,ColumnSerializer> entry:serializers.entrySet()){
				Field field = entry.getKey();
				boolean wasPublic = field.isAccessible();
				field.setAccessible(true);
				TableColumn annotation = field.getAnnotation(TableColumn.class);
				if(annotation!=null){
					String key = annotation.name();
					try {
						String value = row.get(key);
						if(key!=null && value!=null){
							ColumnSerializer colSerializer = entry.getValue();
							if(colSerializer.accepts(field.getType())){
								try{
									Object valueTyped = entry.getValue().deserialize(field.getType(), value);
									field.set(object,valueTyped);
								}
								catch(IllegalAccessException iae){
									throw new Exception(String.format("Unable to set field at %s.%s",clazz.getName(),field.getName())
											,iae);
								}
							}
							else
								throw new SerializationException(String.format("Column serializer %s cannot deserialize the class %s",colSerializer.getClass().getName(),field.getType().getName()));
						}
					} catch(Exception ex){
						ex.printStackTrace();
					}
				}
			}
			return object;
		}
		catch(Exception ex){
			throw new RuntimeException(ex);
		}
	}