Context options: 
    
        /**
         * How many loops of circular reference to allow while normalizing.
         *
         * The default value of 1 means that when we encounter the same object a
         * second time, we consider that a circular reference.
         *
         * You can raise this value for special cases, e.g. in combination with the
         * max depth setting of the object normalizer.
         */
        public const CIRCULAR_REFERENCE_LIMIT = 'circular_reference_limit';
    
        /**
         * Instead of creating a new instance of an object, update the specified object.
         *
         * If you have a nested structure, child objects will be overwritten with
         * new instances unless you set DEEP_OBJECT_TO_POPULATE to true.
         */
        public const OBJECT_TO_POPULATE = 'object_to_populate';
    
        /**
         * Only (de)normalize attributes that are in the specified groups.
         */
        public const GROUPS = 'groups';
    
        /**
         * Limit (de)normalize to the specified names.
         *
         * For nested structures, this list needs to reflect the object tree.
         */
        public const ATTRIBUTES = 'attributes';
    
        /**
         * If ATTRIBUTES are specified, and the source has fields that are not part of that list,
         * either ignore those attributes (true) or throw an ExtraAttributesException (false).
         */
        public const ALLOW_EXTRA_ATTRIBUTES = 'allow_extra_attributes';
    
        /**
         * Hashmap of default values for constructor arguments.
         *
         * The names need to match the parameter names in the constructor arguments.
         */
        public const DEFAULT_CONSTRUCTOR_ARGUMENTS = 'default_constructor_arguments';
    
        /**
         * Hashmap of field name => callable to normalize this field.
         *
         * The callable is called if the field is encountered with the arguments:
         *
         * - mixed  $attributeValue value of this field
         * - object $object         the whole object being normalized
         * - string $attributeName  name of the attribute being normalized
         * - string $format         the requested format
         * - array  $context        the serialization context
         */
        public const CALLBACKS = 'callbacks';
    
        /**
         * Handler to call when a circular reference has been detected.
         *
         * If you specify no handler, a CircularReferenceException is thrown.
         *
         * The method will be called with ($object, $format, $context) and its
         * return value is returned as the result of the normalize call.
         */
        public const CIRCULAR_REFERENCE_HANDLER = 'circular_reference_handler';
    
        /**
         * Skip the specified attributes when normalizing an object tree.
         *
         * This list is applied to each element of nested structures.
         *
         * Note: The behaviour for nested structures is different from ATTRIBUTES
         * for historical reason. Aligning the behaviour would be a BC break.
         */
        public const IGNORED_ATTRIBUTES = 'ignored_attributes';
        
         /**
          * Set to true to respect the max depth metadata on fields.
          */
          public const ENABLE_MAX_DEPTH = 'enable_max_depth';
        
         /**
          * How to track the current depth in the context.
          */
         public const DEPTH_KEY_PATTERN = 'depth_%s::%s';
     
         /**
          * While denormalizing, we can verify that types match.
          *
          * You can disable this by setting this flag to true.
          */
         public const DISABLE_TYPE_ENFORCEMENT = 'disable_type_enforcement';
     
         /**
          * Flag to control whether fields with the value `null` should be output
          * when normalizing or omitted.
          */
         public const SKIP_NULL_VALUES = 'skip_null_values';
     
         /**
          * Callback to allow to set a value for an attribute when the max depth has
          * been reached.
          *
          * If no callback is given, the attribute is skipped. If a callable is
          * given, its return value is used (even if null).
          *
          * The arguments are:
          *
          * - mixed  $attributeValue value of this field
          * - object $object         the whole object being normalized
          * - string $attributeName  name of the attribute being normalized
          * - string $format         the requested format
          * - array  $context        the serialization context
          */
         public const MAX_DEPTH_HANDLER = 'max_depth_handler';
     
         /**
          * Specify which context key are not relevant to determine which attributes
          * of an object to (de)normalize.
          */
         public const EXCLUDE_FROM_CACHE_KEY = 'exclude_from_cache_key';
     
         /**
          * Flag to tell the denormalizer to also populate existing objects on
          * attributes of the main object.
          *
          * Setting this to true is only useful if you also specify the root object
          * in OBJECT_TO_POPULATE.
          */
          public const DEEP_OBJECT_TO_POPULATE = 'deep_object_to_populate';
        
          public const PRESERVE_EMPTY_OBJECTS = 'preserve_empty_objects';
