{"id":142433,"date":"2021-05-07T09:42:05","date_gmt":"2021-05-07T08:42:05","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/"},"modified":"2021-05-13T11:28:11","modified_gmt":"2021-05-13T10:28:11","slug":"kotlinx-serialization-1-2-released","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/","title":{"rendered":"Publication de kotlinx.serialization 1.2\u00a0: traitement JSON deux fois plus rapide, prise en charge des classes value, documentation remani\u00e9e, et plus encore"},"content":{"rendered":"<p><code>kotlinx.serialization<\/code> 1.2 est l\u00e0\u00a0! La derni\u00e8re version de notre biblioth\u00e8que de s\u00e9rialisation multiplateforme apporte un certain nombre d&#8217;am\u00e9liorations, notamment\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#fast-json\">Une augmentation significative de la vitesse de la s\u00e9rialisation JSON.<\/a> Avec la version 1.2 , l&#8217;analyse de JSON en objets Kotlin de type s\u00e9curis\u00e9 et la conversion des objets Kotlin en repr\u00e9sentations textuelles sont jusqu&#8217;\u00e0 deux fois plus rapides qu&#8217;avec la version pr\u00e9c\u00e9dente.<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#15-additions\">Les ajouts au syst\u00e8me de types de Kotlin 1.5 sont d\u00e9sormais pris en charge.<\/a> Les classes value et les nombres non sign\u00e9s peuvent \u00eatre convertis en JSON et inversement, comme toute autre classe Kotlin.<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#api-docs\">La nouvelle documentation de l&#8217;API<\/a> facilite la d\u00e9couverte des diff\u00e9rentes fonctionnalit\u00e9s de <code>kotlinx.serialization<\/code>.<\/li>\n<\/ul>\n<p>La version 1.2 apporte aussi une nouvelle prise en charge des <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#alt-names\">noms alternatifs pour les champs JSON<\/a> et une nouvelle approche exp\u00e9rimentale qui <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#protobuf-schemas\">g\u00e9n\u00e8re automatiquement des sch\u00e9mas Protobuf \u00e0 partir de classes Kotlin<\/a>, une fonctionnalit\u00e9 \u00e0 propos de laquelle nous avons h\u00e2te de recevoir vos commentaires\u00a0!<\/p>\n<p>\u00a0<\/p>\n<p>Examinons ensemble les changements et les ajouts que comporte cette nouvelle version\u00a0! Si vous \u00eates d\u00e9j\u00e0 convaincu\u00b7e, vous pouvez passer directement aux instructions de mise \u00e0 niveau incluses \u00e0 la fin de cet article\u00a0!<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Installer\" href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#start-using\">Commencez \u00e0 utiliser kotlinx.serialization 1.2\u00a0!<\/a><\/p>\n<p><iframe title=\"Vid\u00e9os YouTube\" src=\"https:\/\/www.youtube.com\/embed\/698I_AH8h6s\" height=\"445\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><br \/><a href=\"https:\/\/www.youtube.com\/channel\/UCP7uiEZIqci43m22KDl0sNw?sub_confirmation=1\" target=\"_blank\" rel=\"noopener\">Abonnez-vous \u00e0 la cha\u00eene YouTube de Kotlin\u00a0!<\/a><\/p>\n<p><a name=\"fast-json\"><\/a><\/p>\n<h2>Encodage et d\u00e9codage JSON bien plus rapides<\/h2>\n<p>La possibilit\u00e9 d&#8217;encoder les classes Kotlin en cha\u00eenes JSON et celle de de transformer les cha\u00eenes JSON en classes Kotlin sont les fonctionnalit\u00e9s les plus utilis\u00e9es de <code>kotlinx.serialization<\/code>, et nous travaillons constamment \u00e0 les rendre plus performantes.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/04\/Kotlinx.serialization-1.2_2-03.png\" alt=\"Analyse JSON avec kotlinx.serialization\u00a0: jusqu'\u00e0 55\u00a0% plus rapide\" \/><\/p>\n<p>La version 1.2 remanie compl\u00e8tement la structure interne de <code>kotlinx.serialization<\/code>, ce qui permet d&#8217;obtenir de bien meilleures performances pour ces fonctionnalit\u00e9s essentielles. Nous avons r\u00e9\u00e9crit notre d\u00e9codeur JSON (pour la conversion de texte en objets Kotlin) et apport\u00e9 d&#8217;importantes optimisations \u00e0 notre encodeur JSON (pour la conversion des objets Kotlin en texte).<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/04\/Kotlinx.serialization-1.2_2-02-1.png\" alt=\"Encodage JSON avec kotlinx.serialization\u00a0: jusqu'\u00e0 339\u00a0% plus rapide\" \/><\/p>\n<p>En utilisant la derni\u00e8re version de notre biblioth\u00e8que, vous pouvez b\u00e9n\u00e9ficier d&#8217;une vitesse jusqu&#8217;\u00e0 <em>deux fois sup\u00e9rieure<\/em> pour les t\u00e2ches de codage et de d\u00e9codage classiques. (Comme vous pouvez le voir certains des tests que nous avons r\u00e9alis\u00e9s en interne montrent m\u00eame une <em>vitesse sup\u00e9rieure<\/em> !)<\/p>\n<p>Avec ces changements, <code>kotlinx.serialization<\/code> atteint le m\u00eame niveau de performance (voire un niveau sup\u00e9rieur \u00e0 certains \u00e9gards) que d&#8217;autres autres biblioth\u00e8ques JSON pr\u00eates \u00e0 l&#8217;emploi. M\u00eame les extraits de code les plus simples b\u00e9n\u00e9ficient de ces am\u00e9liorations\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br \/&gt;@Serializable&lt;br \/&gt;data class User(val name: String, val yearOfBirth: Int)&lt;\/p&gt;\n&lt;p&gt;fun main() {&lt;br \/&gt;\/\/ Faster encoding...&lt;br \/&gt;val data = User(&quot;Louis&quot;, 1901)&lt;br \/&gt;val string = Json.encodeToString(data)&lt;br \/&gt;println(string) \/\/ {&quot;name&quot;:&quot;Louis&quot;,&quot;yearOfBirth&quot;:1901}&lt;\/p&gt;\n&lt;p&gt;\/\/ ...and faster decoding!&lt;br \/&gt;val obj = Json.decodeFromString(string)&lt;br \/&gt;println(obj) \/\/ User(name=Louis, yearOfBirth=1901)&lt;br \/&gt;}&lt;br \/&gt;<\/pre>\n<p>La meilleure fa\u00e7on de se faire une id\u00e9e de ces am\u00e9liorations est de tester votre propre application avec la derni\u00e8re version de notre biblioth\u00e8que. Pour une estimation des performances, consultez nos benchmarks internes pour <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/pull\/1354\" target=\"_blank\" rel=\"noopener\">l&#8217;encodage<\/a> et <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/pull\/1343\" target=\"_blank\" rel=\"noopener\">le d\u00e9codage<\/a> qui comparent la derni\u00e8re version de <code>kotlinx.serialization<\/code> \u00e0 la pr\u00e9c\u00e9dente version .<\/p>\n<p><a name=\"15-additions\"><\/a><\/p>\n<h2>S\u00e9rialisation et d\u00e9s\u00e9rialisation JSON stable pour les classes value et les types de nombres non sign\u00e9s<\/h2>\n<p>La version 1.5.0 de Kotlin r\u00e9cemment publi\u00e9e a apport\u00e9 <a href=\"https:\/\/kotlinlang.org\/docs\/inline-classes.html\" target=\"_blank\" rel=\"noopener\">les classes value<\/a> et <a href=\"https:\/\/kotlinlang.org\/docs\/basic-types.html#unsigned-integers\" target=\"_blank\" rel=\"noopener\">les types d&#8217;entiers non sign\u00e9s<\/a>, pour lesquels <code>kotlinx.serialization<\/code> 1.2 offre maintenant une prise en charge de l&#8217;encodage et du d\u00e9codage JSON de premier ordre. Voyons cela de plus pr\u00e8s.<\/p>\n<h3>Prise en charge des classes value<\/h3>\n<p><a href=\"https:\/\/kotlinlang.org\/docs\/inline-classes.html\" target=\"_blank\" rel=\"noopener\">Les classes value<\/a> (auparavant appel\u00e9es <em>classes inline<\/em>) sont un moyen d&#8217;encapsuler un autre type Kotlin (par exemple, un nombre) de mani\u00e8re s\u00e9curis\u00e9e, sans risque de surcharge lors de l&#8217;ex\u00e9cution. Cela permet de rendre vos programmes plus expressifs et s\u00fbrs, sans affecter les performances.<\/p>\n<p>La s\u00e9rialisation JSON int\u00e9gr\u00e9e de <code>kotlinx.serialization<\/code> fonctionne maintenant pour les classes value. Comme pour les autres classes Kotlin, il suffit d&#8217;annoter une <code>classe value<\/code> avec <code>@Serializable<\/code>.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br \/&gt;@Serializable&lt;br \/&gt;value class Color(val rgb: Int)&lt;br \/&gt;<\/pre>\n<p>Les value class sont stock\u00e9es (et s\u00e9rialis\u00e9es) directement comme leur type sous-jacent. Nous pouvons le voir en ajoutant un champ avec un type <code>value class<\/code> \u00e0 une <code>data class<\/code> s\u00e9rialisable et en examinant sa sortie :<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br \/&gt;@Serializable&lt;br \/&gt;data class NamedColor(val color: Color, val name: String)&lt;\/p&gt;\n&lt;p&gt;fun main() {&lt;br \/&gt;println(Json.encodeToString(NamedColor(Color(0), &quot;black&quot;)))&lt;br \/&gt;}&lt;\/p&gt;\n&lt;p&gt;\/\/ {&quot;color&quot;: 0, &quot;name&quot;: &quot;black&quot;}&lt;br \/&gt;<\/pre>\n<p>Dans l&#8217;exemple ci-dessus, <code>NamedColor<\/code> traite la <code>value class<\/code> <code>Color<\/code> comme la <em>primitive sous-jacente<\/em> (un <code>Int<\/code>). Cela signifie que vous b\u00e9n\u00e9ficiez d&#8217;une s\u00e9curit\u00e9 de type maximale dans votre code Kotlin, tout en profitant d&#8217;une repr\u00e9sentation s\u00e9rialis\u00e9e concise de ces types, sans encapsulation ou imbrication inutile.<\/p>\n<p>Nous sommes toujours en train d&#8217;affiner le design des s\u00e9rialiseurs personnalis\u00e9s \u00e9crits \u00e0 la main pour les classes value class et ils sont encore exp\u00e9rimentaux pour le moment. Vous pouvez en apprendre davantage sur ce sujet dans les <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/inline-classes.md#using-inline-classes-in-your-custom-serializers\" target=\"_blank\" rel=\"noopener\">docs sur GitHub<\/a>.<\/p>\n<h3>Prise en charge des entiers non sign\u00e9s<\/h3>\n<p><a href=\"https:\/\/kotlinlang.org\/docs\/basic-types.html#unsigned-integers\" target=\"_blank\" rel=\"noopener\">Les entiers non sign\u00e9s<\/a> sont un ajout \u00e0 la biblioth\u00e8que standard de Kotlin qui fournissent des types et des op\u00e9rations pour les <em>nombres non n\u00e9gatifs<\/em>. Avec la publication de Kotlin 1.5.0, les types de nombres non sign\u00e9s suivants sont disponibles\u00a0:<\/p>\n<ul>\n<li><code>UByte<\/code>, avec des valeurs de 0 \u00e0 255<\/li>\n<li><code>UShort<\/code>, avec des valeurs de 0 \u00e0 65535<\/li>\n<li><code>UInt<\/code>, avec des valeurs de 0 \u00e0 2^32 \u2013 1<\/li>\n<li><code>ULong<\/code>, avec des valeurs de 0 \u00e0 2^64 \u2013 1<\/li>\n<\/ul>\n<p>L&#8217;encodeur et le d\u00e9codeur JSON dans <code>kotlinx.serialization<\/code> prennent maintenant directement en charge ces types. Tout comme pour les autres types de nombres, les valeurs enti\u00e8res non sign\u00e9es seront s\u00e9rialis\u00e9es dans leur repr\u00e9sentation num\u00e9rique standard (la m\u00eame repr\u00e9sentation que vous voyez en invoquant <code>.toString<\/code>), sans troncature, encapsulation ou conversion en types sign\u00e9s.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br \/&gt;@Serializable&lt;br \/&gt;class Counter(val counted: UByte, val description: String)&lt;\/p&gt;\n&lt;p&gt;@Serializable&lt;br \/&gt;class BigCounter(val counted: ULong)&lt;\/p&gt;\n&lt;p&gt;val counted = 239.toUByte()&lt;br \/&gt;println(Json.encodeToString(Counter(counted, &quot;tries&quot;)))&lt;br \/&gt;\/\/ {&quot;counted&quot;:239,&quot;description&quot;:&quot;tries&quot;}&lt;\/p&gt;\n&lt;p&gt;println(Json.encodeToString(BigCounter(ULong.MAX_VALUE)))&lt;br \/&gt;\/\/ {&quot;counted&quot;:18446744073709551615}&lt;br \/&gt;<\/pre>\n<p>Veuillez noter que la prise en charge des classes value et des entiers non sign\u00e9s est actuellement disponible pour JSON. Dans une prochaine version, nous fournirons \u00e9galement des int\u00e9grations directes pour CBOR et Protobuf\u00a0!<\/p>\n<p>Si vous souhaitez \u00eatre inform\u00e9\u00b7e des futures versions de <code>kotlinx.serialization<\/code> et du langage de programmation Kotlin, <em>inscrivez-vous \u00e0 la newsletter d\u00e9di\u00e9e aux mises \u00e0 jour des produits Kotlin<\/em> via le formulaire figurant \u00e0 c\u00f4t\u00e9 de cet article\u00a0!<\/p>\n<p>Pour plus d&#8217;informations sur l&#8217;utilisation des classes value et des types non sign\u00e9s avec <code>kotlinx.serialization<\/code>, consultez la <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/inline-classes.md\" target=\"_blank\" rel=\"noopener\">documentation sur GitHub<\/a>.<\/p>\n<p><a name=\"alt-names\"><\/a><\/p>\n<h2>Prise en charge des noms alternatifs pour les champs JSON<\/h2>\n<p>Vous avez parfois besoin d&#8217;analyser des champs JSON portant des noms diff\u00e9rents mais ayant la m\u00eame signification, par exemple pour maintenir une compatibilit\u00e9 r\u00e9troactive. Avec la nouvelle annotation <code>@JsonNames<\/code>, vous pouvez d\u00e9sormais donner aux champs JSON des noms alternatifs, qui seront utilis\u00e9s lors du processus de d\u00e9codage.<\/p>\n<p>Pour illustrer cela, prenons un exemple. Supposons qu&#8217;en fonction de sa version, un serveur nous donne l&#8217;une des deux r\u00e9ponses suivantes\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br \/&gt;{&quot;name&quot;:&quot;kotlinx.serialization&quot;}&lt;br \/&gt;\/* ...or: *\/&lt;br \/&gt;{&quot;title&quot;:&quot;kotlinx.serialization&quot;}&lt;br \/&gt;<\/pre>\n<p><code>name<\/code> et <code>title<\/code> ont tous deux la m\u00eame signification et nous voulons les mapper sur le m\u00eame champ dans notre classe Kotlin. Avec la nouvelle annotation <code>@JsonNames<\/code>, nous pouvons sp\u00e9cifier <code>title<\/code> comme cl\u00e9 alternative pour la cl\u00e9 <code>name<\/code>\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br \/&gt;@Serializable&lt;br \/&gt;data class Project(@JsonNames(&quot;title&quot;) val name: String)&lt;br \/&gt;<\/pre>\n<p>Vous remarquerez la diff\u00e9rence avec l&#8217;annotation <code>@SerialName<\/code>, qui vous permet de <em>renommer les champs<\/em> pour l&#8217;encodage et le d\u00e9codage, mais ne vous permet pas de <em>sp\u00e9cifier des alternatives<\/em>.<\/p>\n<p>Nous esp\u00e9rons que cette fonctionnalit\u00e9 vous permettra de travailler plus facilement avec des services qui renvoient des champs nomm\u00e9s diff\u00e9remment repr\u00e9sentant les m\u00eames valeurs, de survivre aux migrations de sch\u00e9mas et d&#8217;assurer des mises \u00e0 jour harmonieuses de vos applications\u00a0!<\/p>\n<p><a name=\"api-docs\"><\/a><\/p>\n<h2>Nouvelle documentation de l&#8217;API<\/h2>\n<p>Pour rendre votre apprentissage de <code>kotlinx.serialization<\/code> aussi simple et agr\u00e9able que possible, nous proposons plusieurs documents de r\u00e9f\u00e9rence. L&#8217;un d&#8217;eux est le <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/serialization-guide.md\" target=\"_blank\" rel=\"noopener\">Guide Kotlin Serialization sur GitHub<\/a>, qui pr\u00e9sente les fonctionnalit\u00e9s de la biblioth\u00e8que et inclut des exemples complets pour vous aider \u00e0 bien comprendre chaque fonctionnalit\u00e9.<\/p>\n<p>Par ailleurs, nous avons totalement remani\u00e9 la <a href=\"https:\/\/kotlin.github.io\/kotlinx.serialization\/\" target=\"_blank\" rel=\"noopener\">documentation de l&#8217;API kotlinx.serialization<\/a>. Bas\u00e9e sur une nouvelle version de <a href=\"https:\/\/github.com\/Kotlin\/dokka\" target=\"_blank\" rel=\"noopener\">Dokka<\/a>, le moteur de documentation de Kotlin, la documentation de l&#8217;API dispose d&#8217;un nouveau design adaptatif et moderne, ainsi que de symboles faciles \u00e0 parcourir.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/04\/image1.png\" alt=\"Exemple des nouveaux documents de l'API, montrant la documentation de JsonElement.\" \/><\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Installer\" href=\"https:\/\/kotlin.github.io\/kotlinx.serialization\/\" target=\"_blank\" rel=\"noopener\">Explorez la nouvelle documentation d&#8217;API kotlinx.serialization\u00a0!<\/a><\/p>\n<p><a name=\"protobuf-schemas\"><\/a><\/p>\n<h2>Protobuf\u00a0: g\u00e9n\u00e9ration de sch\u00e9mas exp\u00e9rimentale \u00e0 partir de classes Kotlin<\/h2>\n<p><a href=\"https:\/\/developers.google.com\/protocol-buffers\" target=\"_blank\" rel=\"noopener\">Protocol Buffers<\/a> (Protobuf) est un <em>format de s\u00e9rialisation binaire<\/em> pour les donn\u00e9es structur\u00e9es cr\u00e9\u00e9 par Google. En tant que format binaire, il requiert moins d&#8217;espace que JSON ou XML, tout en fournissant une <em>structure ind\u00e9pendante du langage<\/em> que vous pouvez utiliser pour la communication entre applications.<\/p>\n<p>Avec <code>kotlinx.serialization<\/code>, vous pouvez utiliser la <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/formats.md#protobuf-experimental\" target=\"_blank\" rel=\"noopener\">s\u00e9rialisation multiplateforme Protobuf<\/a> (en utilisant la <a href=\"https:\/\/developers.google.com\/protocol-buffers\/docs\/proto\" target=\"_blank\" rel=\"noopener\">s\u00e9mantique Proto2<\/a>) avec une stabilit\u00e9 <em>exp\u00e9rimentale<\/em>. Comme avec les autres formats, annotez votre classe comme <code>@Serializable<\/code> et utilisez les m\u00e9thodes <code>encode<\/code> \/ <code>decode<\/code> int\u00e9gr\u00e9es\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br \/&gt;@Serializable&lt;br \/&gt;data class Project(val name: String, val language: String)&lt;\/p&gt;\n&lt;p&gt;fun main() {&lt;br \/&gt;val data = Project(&quot;kotlinx.serialization&quot;, &quot;Kotlin&quot;)&lt;br \/&gt;val bytes = ProtoBuf.encodeToByteArray(data)&lt;br \/&gt;println(bytes.toAsciiHexString())&lt;br \/&gt;val obj = ProtoBuf.decodeFromByteArray(bytes)&lt;br \/&gt;println(obj)&lt;br \/&gt;}&lt;br \/&gt;<\/pre>\n<p>Avec vos classes Kotlin comme <em>&#8220;source of truth&#8221;<\/em> (source de donn\u00e9es unique et fiable), combin\u00e9e \u00e0 la <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/formats.md#protobuf-experimental\" target=\"_blank\" rel=\"noopener\">personnalisation<\/a> que vous pourriez vouloir appliquer, <code>kotlinx.serialization<\/code> est capable de d\u00e9duire le sch\u00e9ma binaire des donn\u00e9es, rendant ainsi la communication Protobuf <em>entre plusieurs applications Kotlin<\/em> concise et pratique.<\/p>\n<p><code>kotlinx.serialization<\/code> 1.2 comprend maintenant aussi un <em>g\u00e9n\u00e9rateur de sch\u00e9mas exp\u00e9rimental pour Protocol Buffers<\/em>. Il vous permet de g\u00e9n\u00e9rer des fichiers <code>.proto<\/code> \u00e0 partir de vos classes de donn\u00e9es Kotlin, qui peuvent \u00e0 leur tour \u00eatre utilis\u00e9es pour g\u00e9n\u00e9rer des repr\u00e9sentations de vos sch\u00e9mas de communication dans d&#8217;autres langages, notamment Python, C++ et TypeScript.<\/p>\n<p>Pour savoir comment utiliser le nouveau g\u00e9n\u00e9rateur de sch\u00e9mas, consultez les instructions correspondantes dans la <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/formats.md#protobuf-experimental\" target=\"_blank\" rel=\"noopener\">documentation<\/a>.<\/p>\n<p>Une fois le fichier <code>.proto<\/code> g\u00e9n\u00e9r\u00e9, vous pouvez le stocker dans votre r\u00e9f\u00e9rentiel et l&#8217;utiliser pour g\u00e9n\u00e9rer des repr\u00e9sentations de vos classes Kotlin dans d&#8217;autres langages. Nous esp\u00e9rons que cela vous permettra d&#8217;utiliser plus facilement l&#8217;int\u00e9gration Protobuf de <code>kotlinx.serialization<\/code> dans des applications <em>multi-langages<\/em>, sans avoir \u00e0 renoncer \u00e0 la commodit\u00e9 de g\u00e9rer vos sch\u00e9mas directement dans le code source Kotlin.<\/p>\n<p>Il s&#8217;agit de la <em>premi\u00e8re it\u00e9ration<\/em> du g\u00e9n\u00e9rateur de sch\u00e9mas Protobuf, nous comptons donc beaucoup sur vos retours. Essayez-le et parlez-nous de vos cas d&#8217;utilisation, de la fa\u00e7on dont vous g\u00e9rez vos mod\u00e8les et vos fichiers <code>.proto<\/code>, des probl\u00e8mes que vous rencontrez et des fonctionnalit\u00e9s dont vous voudriez disposer, en utilisant <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/issues\" target=\"_blank\" rel=\"noopener\">l&#8217;outil de suivi de GitHub<\/a>.<\/p>\n<p>Gardez \u00e0 l&#8217;esprit que le g\u00e9n\u00e9rateur de sch\u00e9mas comprend certaines limites. En r\u00e8gle g\u00e9n\u00e9rale, si une classe Kotlin peut \u00eatre s\u00e9rialis\u00e9e avec l&#8217;impl\u00e9mentation protobuf incluse dans <code>kotlinx.serialization<\/code>, alors le g\u00e9n\u00e9rateur de sch\u00e9mas la prendra en charge. Cela signifie \u00e9galement que <a href=\"https:\/\/kotlin.github.io\/kotlinx.serialization\/kotlinx-serialization-protobuf\/kotlinx-serialization-protobuf\/kotlinx.serialization.protobuf\/-proto-buf\/index.html\" target=\"_blank\" rel=\"noopener\">les m\u00eames restrictions<\/a> s&#8217;appliquent. Voici quelques points \u00e0 surveiller\u00a0:<\/p>\n<ul>\n<li>Les <em>classes et noms de propri\u00e9t\u00e9s<\/em> de Kotlin doivent se conformer \u00e0 la <a href=\"https:\/\/developers.google.com\/protocol-buffers\/docs\/reference\/proto2-spec\" target=\"_blank\" rel=\"noopener\">sp\u00e9cification de protobuf<\/a> et ne pas contenir de caract\u00e8res non autoris\u00e9s.<\/li>\n<li>La <em>nullabilit\u00e9<\/em> de Kotlin n&#8217;est pas refl\u00e9t\u00e9e dans le sch\u00e9ma (parce que proto2 n&#8217;a pas de s\u00e9mantique pour cela). <em>Les champs optionnels<\/em> tels que fournis par protocol buffers sont utilis\u00e9s si vos propri\u00e9t\u00e9s Kotlin d\u00e9finissent des <em>valeurs par d\u00e9faut<\/em>.<\/li>\n<li>Les <em>valeurs par d\u00e9faut<\/em> de Kotlin ne sont pas incluses dans le sch\u00e9ma. (ce qui signifie que vous devrez assurer vous-m\u00eame la coh\u00e9rence des valeurs par d\u00e9faut dans les diff\u00e9rentes impl\u00e9mentations du langage)<\/li>\n<\/ul>\n<p><a name=\"start-using\"><\/a><\/p>\n<h2>Commencez \u00e0 utiliser kotlinx.serialization 1.2\u00a0!<\/h2>\n<p>Voil\u00e0 qui conclut notre aper\u00e7u g\u00e9n\u00e9ral. Si nous vous avons donn\u00e9 envie de <em>profiter de la rapidit\u00e9 de l&#8217;encodage et du d\u00e9codage JSON, de la prise en charge des ajouts au syst\u00e8me de types de Kotlin 1.5 et de la g\u00e9n\u00e9ration de sch\u00e9mas Protobuf<\/em>, effectuez la mise \u00e0 jour\u00a0!<\/p>\n<p>Si vous utilisez d\u00e9j\u00e0 <code>kotlinx.serialization<\/code>, la mise \u00e0 niveau vers la version 1.2 est tr\u00e8s rapide (et si vous n&#8217;avez pas encore essay\u00e9 <code>kotlinx.serialization<\/code>, il est temps de vous lancer\u00a0!). Tout d&#8217;abord, mettez \u00e0 jour le bloc <code>plugins<\/code> dans votre fichier <code>build.gradle.kts<\/code>\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br \/&gt;plugins {&lt;br \/&gt;kotlin(&quot;jvm&quot;) version &quot;1.5.0&quot; \/\/ or kotlin(&quot;multiplatform&quot;) or any other kotlin plugin&lt;br \/&gt;kotlin(&quot;plugin.serialization&quot;) version &quot;1.5.0&quot;&lt;br \/&gt;}&lt;br \/&gt;<\/pre>\n<p>Ensuite, mettez \u00e0 jour votre bloc <code>dependencies<\/code> avec la biblioth\u00e8que d&#8217;ex\u00e9cution, y compris les formats que vous voulez utiliser dans votre application\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br \/&gt;dependencies {&lt;br \/&gt;implementation(&quot;org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0&quot;)&lt;br \/&gt;implementation(&quot;org.jetbrains.kotlinx:kotlinx-serialization-protobuf:1.2.0&quot;)&lt;br \/&gt;\/\/ . . .&lt;br \/&gt;}&lt;br \/&gt;<\/pre>\n<h2>Plus de vid\u00e9os et d&#8217;articles<\/h2>\n<ul>\n<li><a href=\"https:\/\/youtu.be\/698I_AH8h6s\" target=\"_blank\" rel=\"noopener\">Vid\u00e9o kotlinx.serialization 1.2<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/\" target=\"_blank\" rel=\"noopener\">Biblioth\u00e8que sur GitHub<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/serialization-guide.md\" target=\"_blank\" rel=\"noopener\">Guide kotlinx.serialization<\/a><\/li>\n<li><a href=\"https:\/\/kotlin.github.io\/kotlinx.serialization\/\" target=\"_blank\" rel=\"noopener\">Documentation de l&#8217;API<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlin-1-5-0-released\/\">Article sur la publication de Kotlin 1.5.0<\/a><\/li>\n<\/ul>\n<h3>Si vous rencontrez des probl\u00e8mes<\/h3>\n<ul>\n<li>Signalez-les sur <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/issues\" target=\"_blank\" rel=\"noopener\">l&#8217;outil de suivi GitHub<\/a>.<\/li>\n<li>Demandez de l&#8217;aide dans le canal Slack #serialization de Kotlin (<a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up\" target=\"_blank\" rel=\"noopener\">obtenir une invitation<\/a>).<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.youtube.com\/channel\/UCP7uiEZIqci43m22KDl0sNw?sub_confirmation=1\" target=\"_blank\" rel=\"noopener\">Abonnez-vous \u00e0 la cha\u00eene YouTube de Kotlin !<\/a><\/p>\n<p>Bonne (d\u00e9)s\u00e9rialisation\u00a0!<\/p>\n<p><em>Auteur de l&#8217;article original en anglais : <a href=\"https:\/\/blog.jetbrains.com\/author\/sebastian_aigner\/\" target=\"_blank\" rel=\"noopener\">Sebastian Aigner<\/a><\/em><\/p>\n\n","protected":false},"author":813,"featured_media":137327,"comment_status":"closed","ping_status":"closed","template":"","categories":[909],"tags":[671],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/142433"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=142433"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/142433\/revisions"}],"predecessor-version":[{"id":142464,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/142433\/revisions\/142464"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/137327"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=142433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=142433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=142433"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=142433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}