 Yeah, so I'm an active contributor to Symphony and the head of training at Sensor Labs. So, my talk is about serializing data, especially with the Symphony Serializer, which is used by Drupal 8. So, I will first talk about how to serialize data with PHP, what we have in PHP for serialization. And I will talk about this Symphony Serializer component and then I will conclude with some integration in Drupal to show you how this Symphony component is used. So, basically, the concept of serializing data means we want to translate data structures. So, scale values, PHP arrays, or PHP objects. So, we want to translate PHP objects to formats that we can store first. And that we can eventually restore to other objects, to the same objects. So that we can, for example, share this serialized content to recreate the PHP object. So, the formats we know for serializing data, for example, are HTTP messages. The HTTP protocol is based on strings, so you are sending an HTTP request and you will receive an HTTP response. So, the content of an HTTP request is serialized as a string. Same for the response, and for example, in Symphony with the HTTP Foundation component, you can recreate a request object and a response object based on the strings. You can use Axomo as a serialization formats or JSON, YAML, CSV, the SOAP format, which is based on Axomo, too. So, these are common formats for serializing data. So, we use serialization for many use cases. So, as I said, storage, you want to store an object into your database, for example, or in a file. Or you want to produce REST APIs. You want to expose your data with a REST API as JSON or XML. You want to use SOAP web services, if some of you are still using SOAP. In the Java words, we are also using serialization of objects to distribute the objects. For example, when you have, you want to have an object on a machine and you want to send it to another machine. So, how we do serialization with PHP? We have different tools. So, the very first function, I guess everyone has already used, is the serialized PHP function. So, this function will serialize any data in a proprietary format of PHP. Well, a format that only PHP can read. So, you can format any scale of value. So, floating point numbers, integers, boolean values, strings, arrays, even objects. So, when you use this series function, you will end up with this kind of output. So, we have the type of the serialized value. So, integer, table, new value, boolean value, string. As you can see, boolean values are stored as zero and one. And for arrays, so we also serialize the values in the array. If you want to deserialize these strings, you can use the earn serialized PHP function, which does the opposite operation. So, it takes the string and reproduces the scalar values of the arrays or objects. So, for the objects, for example, as you can see, we have, we said that it's an object. All means objects. Eight is the class length, the class name. Lengths, you have the class, the class name. And then we have an array which contains all the properties we want to serialize. In this case, there is no properties. But unsealizing and serialized functions are not really handy in the PHP world. They are useful for very basic use cases, but not for many use cases. If you deal with objects in PHP, and if you want to serialize or unsealize PHP objects, you can also use double underscore sleep and double underscore wakeup magic functions. Maybe you already used them. For example, we have this class, a connection object from a database namespace. So, an object that represents a database connection. And it has four properties. We have a link, so the link to the database. We have the data source name, the user and the passwords. And we have these private methods, connects, which creates a PDO instance when it's invoked. And so the PDO instance is stored in this link property. When you have to deal with these kind of objects, these connection objects, this object is stateful, it has a state, and we have these PDO instance inside, which can't be serialized. So you have this kind of PHP object that you can't serialize like PDO. So if you want to serialize a connection object, if for example you want to do that, what you can do is to implement this sleep, double underscore sleep function. So if this function is implemented in your object, PHP will call it when you will use the serialized PHP function. So in this case, I'm just telling that I want to serialize the DSN property, the user property and the password property. I'm just skipping the link property that contains the PDO object. The wake-up function will perform the opposite operation. So when you will execute the un-serialized PHP function, then the object will be recreated thanks to this wake-up function. So we want to automatically reconnect to the database by calling the connect method. So I have my connection object, which receives some user passwords and data source name. And then when I query my database with my query methods, the private methods connect is called to create the PDO connection. And I want to serialize these objects for storing. And then when I will un-serialize the object later on, the wake-up function will be invoked so that I can automatically reconnect to the database and re-curing my database. Another way to use serialization in PHP, I think it's since PHP 5.3 or 5.4, we have a new interface called serializable interface, which basically replaces double underscore wake-up and double underscore sleep. So if your objects implement this interface, you will need to have a serialized function in your objects. And as you can see, in this function, you are free to tell how you want to serialize your PHP object. So you just return the serialized representation of these connection objects. So it's basically the same thing than sleep and wake-up. And for the wake-up function, it's now un-serialized. So you receive the data, so the string, the serialized string, that you can un-serialize to retrieve your values. And then you can repopulate your PHP properties to recreate this connection object and then reconnect to your database, for example. So this is basically the tool we have in PHP natively to serialize and un-serialize data. But we also have JSON. So I guess I wanna use this JSON here. So PHP is able to handle JSON. We have two native functions, JSON encodes and JSON decodes. So JSON encodes receives the scale of data or the PHP array or the PHP object you want to serialize. And it returns the JSON string that corresponds to this scale of value or PHP array or PHP objects. And JSON decode can recreate your initial data from a JSON string. There's also JSON serializable interface you can implement if you want to serialize a PHP object. So if you want an object to be serializable with JSON, so for example, this one is taken from the documentation. We have an object, an array value object that implements this JSON serializable interface. And you can see it forces you to have a JSON serialized method. So it's only for serializing the objects. So you basically just return the, represent the data you want to serialize with JSON. So when you use the JSON encode function, this JSON encode function will check that your object implements this interface and it will automatically call the methods to get the PHP array that contains the data you want to serialize. And it will return the serialize, the JSON serialized representation of that array. So that's what we have in PHP mostly. Sorry. But as I said, the serialization process is very complex, especially the opposite operation. When you want to deserialize a content and you want to recreate an object, an object graph, that's particularly complex. We will say that because for example in JSON, in JSON you don't have any metadata in the JSON file. So when you have nested object graphs, it becomes more complex to unserialize data. So you have to take into account also circular references if you have nested object graphs. You have to take care about the types. Maybe you don't want to serialize everything, so you want to hide some data in your serialize output. You may want to serialize two different formats. So JSON and XMO, you want to be able to support different formats. So this is why this process of serializing data is very complex on a daily basis. So symphony comes with a component called symphony serializer, which performs this task of serializing data, so from serializing a PHP array or PHP object to JSON or XMO, basically, and also be able to recreate the object graph based on a serialized XMO or JSON string. So this component is meant to turn objects into a specific format, XMO, JSON, and YAML, or something else. It's up to you. And also be the, and also recreate the object graphs based on the serialized content. So this is how it works. This is the internal implementation of this serializer. So the serializer can serialize or unserialize. So we have the two operations. So I can serialize and I can unserialize. So when you have an object graph, a PHP object that you want to serialize, when you will invoke this serialize function or methods on the serializer, your object will first be normalized to a PHP array. That's the first step. We want to get a PHP array representation of the object graph. So we have an array and then this array can be encoded to a standard format like JSON or XMO. Because by default, we support the two formats. If you want to support, let's say, YAML, you can implement an extension of this serializer component to support YAML format or something else. This is what Drupal does for, for example, JSON-JSON-HAL. They have an extension of the serializer component. I will show you that later on. But yes, this is what we have. A two-step process. I will normalize my PHP object to an array and then I will encode the PHP array to an XML string or JSON string. And when I want to un-serialize a JSON string or an XML string, I will first decode that string and to reproduce a PHP array. And from that PHP array that represents my object graph, I will be able to denormalize the array to recreate the object graph. This is how this serializer object works. Also, the class, the main serializer class, implements all those methods. So you have serialize and deserialize. So these are the two methods you will mostly call on these objects. But you can also only normalize and denormalize an object to PHP arrays if you just need this step in particular. Or you can encode and decode a PHP array to JSON or to XML if you just need this step. You can also do that with the encoded decode functions. And you can also check if you support normalization and denormalization or if you want to support encoding and decoding. But mainly you will use the first two methods to serialize and un-serialize contents. So this is how you can set up these components. You need the main serializer object, the main serializer class that comes from the serializer components, the serializer namespace. And as you can see, this object is constructed with two parameters, an array of normalizers and an array of encoders. So the array of normalizers, so we have multiple normalizers. In this case I'm just using one, the property normalizer. And we can also populate the serializer object with two or many encoders. So in this case I'm using the two default JSON encoder and XML encoder. And then you just have to call the serialize method. You give it an object, PHP object you want to serialize. The format in which you want to convert this PHP object, so in this case JSON. And it returns the JSON representation of this object graph. If you want to retrieve your original PHP object from a JSON string, you can use the deserialize function. So you pass the JSON string. Then you tell which kind of objects, which type of object you want to recreate with this serializer. And what's the original format you are passing to that serializer object. And so in this case, my serializer would be able to unserialize the JSON string into this ACME backslash user object. So if we recreate this ACME backslash user instance. So the API has four normalizers by default in the symphony core components, in this component. So the property serializer basically introspects your object and it gets the values from the PHP properties. So if you expose public properties, the values will be extracted from the object. If your object has privates or protected properties, in this case, the serializer will use the reflection API to introspect the internals of your PHP object to get the values from your object. And same when the normalizer will repopulate your object, it will also use the introspection to repopulate the... The get set method normalizer uses getters to get the values of your objects. So if you have get a method or is a method or has a method, it will be invoked by this normalizer. And it also use the set a method to repopulate your PHP object. The object normalizer is, I would say an extension of the get set method normalizer, but it uses another component which is called property access. It's a symphony component that encapsulates introspection operation. And we have this custom normalizer to let you implement custom normalizing steps. Regarding the encoders, we have two main encoders, the JSON encoder and the XML encoder, but you can also use the chain encoder and chain decoder to chain multiple encoders or chain multiple decoders. So I will show you some basic usages first of this component and I will show you then the new features coming in 2.6, 2.7 versions. So let's say we have a class, a movie object first, a very simple movie object. Which has some properties, so some IDs, title, description, release dates, storage key and so on. So I want to serialize this object to JSON or XML. So I'm populating my movie objects with some informations. So I want to serialize the seven movie, if you saw this movie, and then I will use my serializer to turn my movie object into a JSON string or XML string with my serialized method, oops, sorry. I can make the opposite operation with the deserialize function. So by default, when you use the property normalizer, as I said, the property normalizer introspects your object. So if you have public property, they are red. But if you have private or protected properties, they are introspective. And as you can see in JSON, my movie objects looks like this. It's basically like a JSON encode. Because we have a very simple object graph. And in XML, you will get this representation. So we can see that we have all the properties. ID by default is not set, same for the storage key, but we have a tag for ID and storage keys, but they don't have any values. They are not set in the PHP object. And we can see that the release date tag is written in common case. If you want to deserialize the string, so remember, you can use the deserialize function. You just give it the JSON string, the type you want to recreate, the type of object you want to recreate, and the input format, in this case JSON. And so the solizer will recreate the movie object. So this is in JSON, this is in XML. And if you print the state of your object, as you can see, so the ID is not set because in the serialized string, it was not set. But the title, the slug, the description, the duration, and the release date are repopulated into the movie object. This normalizer, this property normalizer, has a nice integration for the construct method. If, for example, you have a construct method in your object, when your string will be denormalized, when your object will be recreated, repopulated, the normalizer will first check if there's a construct method which accepts an argument, and if you have a match with the PHP variable name and your property, no, I'm sorry, if you have PHP variable names that match the serialized attributes in JSON or XML, in this case, the normalizer will automatically call your construct method and inject the values, only for the parameters you want to inject. And for the other properties, then the normalizer will use the introspection to repopulate the other parameters. So this is by default in the default property normalizer. As I said, we have a get set method normalizer, which is able to call any getter, hazard, or is a method by convention. So instead of using my property normalizer, I will use the get set method normalizer, or also the object normalizer, which perform the same set of functions. Yes, the object normalizer, the difference with get set method normalizer is that object normalizer calls the hazard methods. The get set method normalizer doesn't support hazard methods, it just supports get set and is a method. So if, for example, your object exposes get a method, like get ID, get title, and in this case, is released, I want to know if this movie has been released, or I want to know if this movie has a category, has a genre. So in this case, just by convention, creating hazard and get a method, or is a method, will produce, in this case, as you can see we have a genre new property, which says false, and we have a released attribute, which corresponds to that, is released public method. And same in axiomal, so we are going to serialize the Boolean values, so zero and one, so this is by default how the normalizer converts the Boolean values. So in this case, we are serializing the whole PHP objects, but most of the time, you don't want to serialize everything, you just want to expose some parts of your objects. So you can configure the serializer or the normalizer to just expose some part of your PHP objects. On any normalizers, you can use this set ignore attributes method, which is just an array of the attributes you want to skip from the normalization and from the serialization. In this case, the storage attribute, I don't want to expose it because I consider it's an internal property, an internal value, so I can ignore this attribute, and as you can see, when I serialize my string to my object, to a JSON string on XML string, this storage key is not in the output anymore. So this feature has been introduced, I think in 2.6, if I remember, so it's a very recent one. Another thing you might want to achieve with this serializer is to change the naming of the properties. We saw that the release date property was written in camel case, but maybe you want to expose your properties to a snake case or underscore case. So you can pass to any normalizer, you can inject a second argument, which is a name converter, and symphony by default support a camel case to snake name converter. So you just pass an instance of this object, and the normalizer will normalize any camel case attributes to a snake case attributes. I will talk about the first argument later on. It has this object implement an interface. You can also create your own custom implementation of this name converter. Let's say you don't want to use snake case or camel case, you want to have something more custom. For example, you want to have some prefixes for your attributes. So you can create your own custom class, your own custom implementation of this name converter interface, which is taken from the serializer components. And so this object will implement the two method, normalize and denormalize public method from the interface. So for example, I want to set up a particular prefix for all my attributes, and when I will normalize my attributes to a PHP array, I want my attributes to be named the prefix underscore my attribute name. And when I will deserialize or when I will denormalize my XM string to PHP array, I will remove the prefix to recreate the original attributes. So this feature has been introduced in 2.7, so it's not yet stable, while the 2.7 version will be released in two weeks, maybe at the end of May, beginning of June, but it's already in the core, so you can already get this code. So as you can see, when I serialize my objects, I get all my attributes with a prefix, with a movie underscore prefix, if this is the prefix I've configured here in my construct method. You can also change the XML root name, because here, as you can see by default, you will have response as the XML root name, but you may want to have something more custom. So you can pass a context to your serialize function. The third argument here is a context. So we have this context, XML root node name, where you can change the root XML nodes when you dump your object to XML. So in this case, I want to have movie instead of response for my XML output. If you want to desalize your string into an object, you can also perform your desalization into an existing object. So instead of recreating a new object, you can add the solizer to repopulate an existing object. For example, you fetch some object from a database, and then you also have some serialized contents that you want to desalize, and you want to update your PHP objects, your existing PHP object with the solizer. So this is how you can do that. We have some serialized content of the movie object, so as you can see, I just want to have two properties serialized in my XML or JSON string. I have an existing object, so this one, which is pre-populated with some values, and I want to complete the population of these objects with my serializer. So you can pass an object to populate attributes in your third context array. Just give it the instance you want to repopulate, and in this case, the serializer will populate this object instead of instantiating a new movie instance. So if you compare movie one and movie two in PHP, you will see that the two variables are pointing to the same reference in memory, the two same objects. So in the end, so my movie object, when I fetch it, for example, from the database, it had those three property sets, and the object was completed with those two values taken from the serialized JSON or XML content. So that's basically what you can do with these serializer components, but I'll just show you how to serialize a very basic PHP object, a single instance, a single object graph. What we want to achieve is to serialize more complex object graph, when you have nested objects, an object that contains other objects. So let's say now my movie object can support some category object or genre object, a list of directors and an array of roles. As you can see this array of roles in the documentation, it says that it's a list of role objects, and each role object keeps a reference to the current movie and also to the actor object that plays a character in this movie. So we have first a one-to-one unidirectional relationship so between my movie and the category. So we have a genre object with some IDs, some title and some slug, and I want to set my genre object in the movie. So when I will serialize this object graph, as you can see the outputs contains my main movie object, and we have an embedded genre object with the serialize ID, title, and slug. Same for JSON. If you want to serialize to JSON, you will get your embedded genre object. If you want to serialize your list of directors, so in this case, we have a one-to-many relationship, but it's unidirectional. So we just have the movie that has directors, but the directors are not yet linked to movies. So we have a bunch of directors, I have two directors for this movie. So this one and this one, they have names and birth dates. I can push my two directors to the movie objects, and then I will serialize my object graph. We will get a list of directors. So we have the first director and the second directors. As you can see, we have the name of the property for each director, so we have directors tag instead of director. But this is how the serializer by default serializes this director's array as XMO and as JSON. So we have a director's key, which is an array, and inside this array, we have two JSON objects for the two directors. So it works with one-to-many, many-to-many, one-to-many, one-to-one, and also with many-to-many relationship. But this one is a bit tricky because we have a bidirectional relationship. Remember, we have this list of roles, so in my movie, I have actors, and each actor plays one or more different characters in the movie. So the role objects keeps reference of the movie and the actor in this movie and the character played by this actor in the movie. So if I create some roles, so we have two actors. We have Brad Pitt and Morgan Freeman. Both play one different role. We have the role stored in the movie object, and when you serialize your movie objects, then you've got a PHP file error in this case. The serializer detects a circular reference. So as you have the movie that contains roles and roles contains movies, so you are pointing to movies and then movies contains role and so on. So the serializer doesn't allow you to serialize this many to many relationship. So that's the tricky part of handling serializing. But you can fix that. You can easily handle circular references. If you don't want to get the nested movie object in your JSON or XML outputs, you can configure a circular reference handler. So this has been introduced in Symphony 2.6. The handler is basically just a PHP callback. So any PHP valid callback can be used. And so basically we just return a different representation of this nested object. So instead of returning the whole object to be serialized, I will just return, for example, the primary key of this object. So that I can retrieve it later on for denormalizing. So if now I try to serialize my movie object that contains roles, so as you can see for each role, so we have the embedded actor, we have the name of the character, and we just have the primary key for this movie object. I don't need to get the whole object graph as it's already as the root of my serialized XML string or JSON string. So you just set up a callback to handle this circular reference. And if, for example, you set up a custom denormalizer, you will be able to refresh your movie object with this ID. You can also use a callback, a custom callback normalizer. So for this one, yes, as you can see, we have now daytime object. You want to store daytime objects instead of strings for dates. And so if you have daytime object, for example, if you normalize, if you serialize your movie objects, so for each actors, directors, or for the release dates, by default, the serializer will simply serialize your daytime object. So you will get something like this for a daytime object. So you have all the properties of a daytime object that are serialized to JSON or XML. But you don't want to have these whole daytime object serialized. You just want to have the dates in a particular format. So to handle those special cases, you can also configure a custom callback. So with the set callbacks methods of my normalizer, so my get set method normalizer, or object normalizer, objects, I will configure a callback. And I'm saying that for any release dates, birthday, or death day attributes that I want to serialize, I want to normalize it with this callback function. And so this callback function will receive a daytime object. And if we receive a daytime object, we want to serialize it to just a string, a day string, whatever format you want to use. And if it's not a daytime object, then we don't want to serialize it. So we just returns null or an empty string. So now my daytime objects will be serialized to the format I've configured in my callback function. So you can do that with any objects that you want to serialize. For example, you have, I don't know, price objects that contain some amounts and some currency value. Then you want to serialize to the value space and the currency codes. So same in JSON, we have this release date, birth date, converted in string. You can also use the custom normalizer. This one has been recently introduced, I think in 2.6 or 2.7. It allows you to check if your user object, if your object that you want to serialize implement a particular interface. So you can embed the process of normalizing the data directly into your object to be serialized. So if you register this normalizer in your list of normalizer, this normalizer will just check that your object to normalize or denormalize and implement this interface, normalizable interface. And if you implement this interface, it's up to you to return a normalized representation of your PHP objects. Be aware with this implementation, you have to also take care of the recursive operation. You must do the recursive normalization yourself. So in this case, I'm just serializing the properties, but if you have nested objects, you have to manually recursively normalize them. One of the new features coming in 2.7 is these serialization groups. As I said, you don't want to serialize everything in your object. You want to serialize the objects based on a context. So for example, you want to output more values, more attributes for admin users, but for regular users, you just want to output a subset of your objects. So thanks annotations, you can, for example, configure groups on your properties or on your methods. So for example, for the ID property, I just want to expose this ID property for admin users. Or I want to expose the slug property for admin users or publisher users. So a group is just a string, it's just a name. It's up to you to choose the name you want. And for example, the release, the ease release function that produce the release attribute will be available for everyone. So you can configure these groups in annotations if you are familiar with annotations. In Drupal, as you mostly use YAML, you can also configure your serialization groups with YAML. So we have this file where you can specify at the root the name of the class, which is serialize, and the attributes in this class that you want to serialize. So for the ID attributes, I want to serialize with the admin groups. For the title, I want to serialize with admin or publisher or user groups and so on. You can also do that in XML. So you can have an XML file that configures your serialization groups. It's much more verbose, but it's also supported by the components. If you want to set up this metadata in the components, you will need to load a YAML file or an XML file or some annotations. So you have some objects provided by the components to perform this task. And remember, the normalizer can accept two arguments. I already show you the second argument, the name converter. But now you can pass a metadata factory object. So this object contains the metadata of your serialization groups. So it knows how you want to serialize your objects. And so when you serialize your object, you can pass a second, in this case, a groups option to your context. So my context in this case is that I want to serialize my movie object only for the user groups. So only the properties that has the user's annotation or the user's groups will be exposed in JSON or XML. We want to expose the other properties. And it works if you deserialize. If you have some constraints on groups, your object will be recreated and populated according to your configured groups as well. So how this works into Drupal. So I'm not a Drupal guy, so I try to understand how Drupal integrates these components. So basically there is a serialization module in the core directory that integrates the symphony serializer. So if we look at these components or this module, it looks, it has this shape. The most important file is probably the service file that declares the serializer services. And we can see that these components provide some custom encoders and normalizers for Drupal entities or Drupal data structures. So they have an encoder and a normalizer directories. So if we look at the normalizer directory, this is what it contains. So these are implementation of normalizers for normalizing Drupal specific data structures. I don't know about Drupal, but I know that there are some config entity or some content objects. So this is how they are normalized to for the REST API in Drupal. So when I look at the Drupal integration, I saw that they don't use the symphony built-in normalizers. They only use their normalizers. So they are free to do that as they implement the corresponding interface. And those services or those normalizers, encoders, and serializer are configured as services in the dependency injection container. So the module embeds this serialization.services.tml file. And this is where we configure all the services. So remember we have a serializer object, a serializer service. By default, it takes empty normalizers and an empty array of encoders. So how this serializer object is populated with normalizers and encoders, this is thanks to those tags. When you register a service in Drupal, and if you tag your service with normalizer or with encoder, then your service will be automatically injected as the first argument of the serializer or as the second argument of the serializer object. So this is done by what we call compiler passes. So a compiler pass is basically a piece of algorithm which post-processes the compilation of the container, the dependency injection container. So that way, if you want to register a custom normalizer yourself, you can just create your new normalizer class, and then you just register this object as a service that you tag with the normalizer tag, and then Drupal will take your service and inject it into the symphony serializer. So this is all the services, all the registered services in Drupal. The most important, of course, is serializer. You should not use those ones manually. You should always use the serializer objects, the main objects. And there is a second component in Drupal, which is the HAL component or the HAL core module, which also uses the symphony serializer to expose the data as a JSON HAL representation. So again, for this module, so as you can see, this module extends, it extends the serialization module, and it provides new normalizers. So normalizers to normalize data structures to JSON HAL representations. So again, there's an alt.services.tml file, which configures new normalizers, new encoders. So again, we have the normalizers here, and they are tagged with normalizer tag or encode tag so that Drupal can take those services and inject them into the serializer objects. We can see that we have some priorities also here on this tag. So this is to let Drupal organize the order of these normalizers in the symphony serializer, because the order in which you register the normalizers will matter when the serializer will serialize content. So this is how Drupal integrates the symphony serializer components. If you want to create your custom normalizers, you just create a new module, you create those corresponding service files, and you register your services with the corresponding normalizer or encode tags. If you want to go further with serialization, just a new library, which is called JMS Serlizer. So the symphony core component, this symphony serializer component works well for many use cases, but if you really want to have very advanced serializations system, then you should go on JMS Serlizer, which is a PHP open source library you can get with Composer. And this tool provides much more advanced feature for serializing data. You can handle, for example, versioning. If, for example, you want to expose a REST API and you want to support a versioning of your API, this component can support by default versioning of your data. It integrates with dark twins, symphonies, and framework. Maybe there's a Drupal module, I haven't checked. It gracefully handles the circular references, and you can configure everything in YAML or XML or annotations for the metadata. For example, you can configure how to convert a collection of objects into JSON or XML, it's much more advanced than the symphonies serializer components. So in the symphony context, developers mostly use these components in replacement of the default symphony components for advanced use cases, of course. So my advice is that if you have very simple use cases for serializing data, just use the symphony component, it works well. As we saw, this serializing data is very complex, especially when you have to end all metadata, when you have to reconstruct very complex object graph. So for simple use case, use the symphony serializer for more advanced use cases, use this JMS serializer library in replacement of the symphony one to have a better serialization system. Is there any questions, are there any questions? No questions? Okay. This is actually more of a comment. The serialization module in Drupal 8 is tied to an API called the type data API. And it's a way of describing simple and complex data types. So when you're talking about, it's kind of an alternative to the JMS serializer, JMS serializer component you were talking about. So for instance, if I had a Drupal node, the serialization module helps to deserialize and serialize Drupal nodes, or any entity or data type that is custom defined. So if you were to define a, in my example, in modules that I'm creating right now, I have an accounting service that I integrate with. So if creating an invoice, for example, that from an API and the type data API in Drupal allows you to define like that invoice data type, and then you can directly integrate it with the serializer component. So that was just a comment, not a question. Okay. Thank you. Other questions? Thank you much.