You can obtain free community support for example through stackoverflow, or also through the Symfony2 mailing list.
If you think you found a bug, please create a ticket in the bug tracker.
        If you take code quality seriously, try out the new continuous inspection service.
        
scrutinizer-ci.com
    
You can register any service as a handler by adding either the jms_serializer.handler,
or the jms_serializer.subscribing_handler.
<service id="my_handler" class="MyHandler">
    <tag name="jms_serializer.handler" type="DateTime" direction="serialization" format="json"
                method="serializeDateTimeToJson" />
</service>
direction attribute is not required if you want to support both directions. Likewise can the
method attribute be omitted, then a default using the scheme serializeTypeToFormat,
or deserializeTypeFromFormat will be used for serialization or deserialization
respectively.You can use the tags jms_serializer.event_listener, or jms_serializer.event_subscriber
in order to register a listener.
The semantics are mainly the same as registering a regular Symfony2 event listener except that you can specify some additional attributes:
kernel.event_listener tag,
or the @DI\Observe annotation. Please see above.You can add custom expression functions using the jms.expression.function_provider tag.
<service id="my_function_provider" class="MyFunctionProvider">
    <tag name="jms.expression.function_provider"/>
</service>
my_function_provider:
    class: MyFunctionProvider
    tags:
        - jms.expression.function_provider
A functions provider for the Symfony Expression Language might look something as this:
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
class MyFunctionProvider implements ExpressionFunctionProviderInterface
{
    public function getFunctions()
    {
        return [
            new ExpressionFunction('str_rot13', function ($arg) {
                return sprintf('str_rot13(%s)', $arg);
            }, function (array $variables, $value) {
                return str_rot13($value);
            })
        ];
    }
}
You can read more about it on the official expression function providers documentation.
To define the metadata using YAML or XML, you need to specify their location and to which PHP namespace prefix they refer.
jms_serializer:
    metadata:
        directories:
            App:
                namespace_prefix: "App\\Entity"
                path: "%kernel.project_dir%/serializer/app"
            FOSUB:
                namespace_prefix: "FOS\\UserBundle"
                path: "%kernel.project_dir%/serializer/FOSUB"
<jms-serializer>
    <metadata>
        <directory namespace_prefix="App\Entity"
                   path="%kernel.project_dir%/serializer/app" />
        <directory namespace_prefix="FOS\UserBundle"
                   path="%kernel.project_dir%/serializer/FOSUB" />
    </metadata>
</jms-serializer>
path must not contain trailing slashes.ymlSuppose you want to define the metadata using YAML for the classes in the App\\Entity namespace prefix
and the configured path is %kernel.project_dir%/serializer/app, then your metadata file should be named:
%kernel.project_dir%/serializer/app/Product.yml.
This feature is also useful for Overriding Third-Party Metadata. Sometimes you want to serialize objects which are shipped by a third-party bundle. Such a third-party bundle might not ship with metadata that suits your needs, or possibly none, at all. In such a case, you can override the default location that is searched for metadata with a path that is under your control.
A Constructor class is used to construct new objects during deserialization. The default constructor uses the unserialize function to construct objects. Other constructors are configured as services. You can set the constructor by changing the service alias:
services:
    jms_serializer.object_constructor:
        alias: jms_serializer.doctrine_object_constructor
        public: false
<services>
    <service id="jms_serializer.object_constructor" alias="jms_serializer.doctrine_object_constructor" public="false">
    </service>
</services>
Below you find a reference of all configuration options with their default values:
# config.yml
jms_serializer:
    handlers:
        datetime:
            default_format: "Y-m-d\\TH:i:sP" # ATOM
            default_timezone: "UTC" # defaults to whatever timezone set in php.ini or via date_default_timezone_set
        array_collection:
            initialize_excluded: false
    subscribers:
        doctrine_proxy:
            initialize_virtual_types: false
            initialize_excluded: false
    object_constructors:
        doctrine:
            fallback_strategy: "null" # possible values ("null" | "exception" | "fallback")
    property_naming:
        id: ~
        separator:  _
        lower_case: true
    metadata:
        cache: file
        debug: "%kernel.debug%"
        file_cache:
            dir: "%kernel.cache_dir%/serializer"
        include_interfaces: false
        infer_types_from_doc_block: false
        # Using auto-detection, the mapping files for each bundle will be
        # expected in the Resources/config/serializer directory.
        #
        # Example:
        # class: My\FooBundle\Entity\User
        # expected path: @MyFooBundle/Resources/config/serializer/Entity.User.(yml|xml|php)
        auto_detection: true
        # if you don't want to use auto-detection, you can also define the
        # namespace prefix and the corresponding directory explicitly
        directories:
            any-name:
                namespace_prefix: "My\\FooBundle"
                path: "@MyFooBundle/Resources/config/serializer"
            another-name:
                namespace_prefix: "My\\BarBundle"
                path: "@MyBarBundle/Resources/config/serializer"
        warmup:
            # list of directories to scan searching for php classes to use when warming up the cache
            paths:
                included: []
                excluded: []
    expression_evaluator:
        id: jms_serializer.expression_evaluator # auto detected
    default_context:
        serialization:
            serialize_null: false
            version: ~
            attributes: {}
            groups: ['Default']
            enable_max_depth_checks: false
        deserialization:
            serialize_null: false
            version: ~
            attributes: {}
            groups: ['Default']
            enable_max_depth_checks: false
    visitors:
        json_serialization:
            options: 0 # json_encode options bitmask, suggested JSON_PRETTY_PRINT in development
            depth: 512
        json_deserialization:
            options: 0 # json_decode options bitmask
        xml_serialization:
            format_output: false
            version: "1.0"
            encoding: "UTF-8"
            default_root_name: "result"
            default_root_ns: null
        xml_deserialization:
            options: 0 # simplexml_load_string options bitmask
            external_entities: false
            doctype_whitelist:
                - '<!DOCTYPE authorized SYSTEM "http://some_url">' # an authorized document type for xml deserialization