{"id":143637,"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-20T02:52:16","modified_gmt":"2021-05-20T01:52:16","slug":"kotlinx-serialization-1-2-released","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/pt-br\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/","title":{"rendered":"Lan\u00e7amento da kotlinx.serialization 1.2: tratamento de JSON de alta velocidade, suporte para value classes, documentos revisados e muito mais"},"content":{"rendered":"<p>A <code>kotlinx.serialization<\/code> 1.2 j\u00e1 est\u00e1 dispon\u00edvel! A vers\u00e3o mais recente da nossa biblioteca de serializa\u00e7\u00e3o multiplataforma traz uma s\u00e9rie de melhorias. Aqui est\u00e3o os destaques:<\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#fast-json\">A serializa\u00e7\u00e3o JSON est\u00e1 mais r\u00e1pida do que nunca.<\/a> A vers\u00e3o 1.2 \u00e9 at\u00e9 duas vezes mais r\u00e1pida que as vers\u00f5es anteriores ao analisar JSON em objetos Kotlin com seguran\u00e7a de tipos e transformar objetos Kotlin em suas representa\u00e7\u00f5es de texto.<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#15-additions\">Agora, h\u00e1 suporte para adi\u00e7\u00f5es ao sistema de tipos do Kotlin 1.5. <\/a>Value classes e n\u00fameros sem sinal podem ser transformados em JSON, e vice-versa, como qualquer outra classe Kotlin.<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#api-docs\">A nova documenta\u00e7\u00e3o de APIs<\/a> torna mais f\u00e1cil descobrir toda a funcionalidade que a <code>kotlinx.serialization<\/code> tem a oferecer.<\/li>\n<\/ul>\n<p>A vers\u00e3o 1.2 tamb\u00e9m inclui novo suporte para <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#alt-names\">nomes alternativos para campos JSON<\/a> e fornece uma nova abordagem experimental que <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#protobuf-schemas\">gera esquemas Protobuf a partir de classes Kotlin<\/a> automaticamente, um recurso sobre o qual estamos ansiosos para receber seus coment\u00e1rios!<\/p>\n<p><span id=\"more-137135\"><\/span><\/p>\n<p>Vamos explorar juntos as mudan\u00e7as e adi\u00e7\u00f5es nesta nova vers\u00e3o! Se voc\u00ea j\u00e1 se convenceu, tamb\u00e9m pode saltar diretamente para as instru\u00e7\u00f5es de upgrade abaixo!<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Instalar\" href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-serialization-1-2-released\/#start-using\n\">Comece a usar a kotlinx.serialization 1.2!<\/a><\/p>\n<p><iframe title=\"Player de v\u00eddeo do YouTube\" src=\"https:\/\/www.youtube.com\/embed\/698I_AH8h6s\" height=\"445\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><br \/>\n<a href=\"https:\/\/www.youtube.com\/channel\/UCP7uiEZIqci43m22KDl0sNw?sub_confirmation=1\" target=\"_blank\" rel=\"noopener\">Assina o canal do Kotlin no YouTube!<\/a><\/p>\n<p><a name=\"fast-json\"><\/a><\/p>\n<h2>Codifica\u00e7\u00e3o e decodifica\u00e7\u00e3o JSON mais r\u00e1pidas do que nunca<\/h2>\n<p>A capacidade de codificar classes Kotlin em strings JSON e a capacidade de transformar strings JSON em classes Kotlin s\u00e3o os recursos mais comumente usados da <code>kotlinx.serialization<\/code>, e estamos trabalhando constantemente para melhorar o desempenho.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/04\/Kotlinx.serialization-1.2_2-03.png\" alt=\"An\u00e1lise do JSON com a kotlinx.serialization: at\u00e9 55% mais r\u00e1pida\"><\/p>\n<p>A vers\u00e3o 1.2 revisa completamente a estrutura interna da <code>kotlinx.serialization<\/code>, resultando em um desempenho significativamente melhor na funcionalidade central. Reescrevemos nosso decodificador JSON (respons\u00e1vel por transformar texto em objetos Kotlin) e fizemos otimiza\u00e7\u00f5es significativas no nosso codificador JSON (respons\u00e1vel por transformar objetos Kotlin em texto).<\/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=\"Codifica\u00e7\u00e3o do JSON com a kotlinx.serialization: at\u00e9 339% mais r\u00e1pida\"><\/p>\n<p>Com o simples upgrade para a vers\u00e3o mais recente da nossa biblioteca, voc\u00ea pode esperar at\u00e9 o <em>dobro da velocidade<\/em> para tarefas t\u00edpicas de codifica\u00e7\u00e3o e decodifica\u00e7\u00e3o. (Como voc\u00ea pode ver, alguns dos nossos benchmarks internos, que foram particularmente afetados por essas novas otimiza\u00e7\u00f5es, chegaram at\u00e9 mesmo a <em>exceder<\/em> esse n\u00famero!)<\/p>\n<p>Com essas mudan\u00e7as, a <code>kotlinx.serialization<\/code> atinge (e de certa forma excede) logo de cara a paridade de desempenho com outras bibliotecas JSON. At\u00e9 mesmo os snippets mais simples se beneficiam com essa revis\u00e3o:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">@Serializable\ndata class User(val name: String, val yearOfBirth: Int)\n\nfun main() {\n\/\/ Faster encoding...\nval data = User(\"Louis\", 1901)\nval string = Json.encodeToString(data)\nprintln(string) \/\/ {\"name\":\"Louis\",\"yearOfBirth\":1901}\n\n\/\/ ...and faster decoding!\nval obj = Json.decodeFromString(string)\nprintln(obj) \/\/ User(name=Louis, yearOfBirth=1901)\n}\n<\/pre>\n<p>Para perceber essas melhorias voc\u00ea pode fazer um benchmark da sua aplica\u00e7\u00e3o com a vers\u00e3o mais recente da nossa biblioteca. Para alguns n\u00fameros aproximados de desempenho, voc\u00ea pode conferir nossos benchmarks internos para <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/pull\/1354\" target=\"_blank\" rel=\"noopener\">codifica\u00e7\u00e3o<\/a> e <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/pull\/1343\" target=\"_blank\" rel=\"noopener\">decodifica\u00e7\u00e3o<\/a>, que comparam a vers\u00e3o mais recente da <code>kotlinx.serialization<\/code> com sua vers\u00e3o anterior.<\/p>\n<p><a name=\"15-additions\"><\/a><\/p>\n<h2>Serializa\u00e7\u00e3o e desserializa\u00e7\u00e3o JSON para value classes e tipos de n\u00fameros sem sinal<\/h2>\n<p>O Kotlin 1.5.0 oferece duas adi\u00e7\u00f5es interessantes: <a href=\"https:\/\/kotlinlang.org\/docs\/inline-classes.html\" target=\"_blank\" rel=\"noopener\">value classes<\/a> e <a href=\"https:\/\/kotlinlang.org\/docs\/basic-types.html#unsigned-integers\" target=\"_blank\" rel=\"noopener\">tipos inteiros sem sinal<\/a>, para os quais a <code>kotlinx.serialization<\/code> 1.2 agora oferece suporte de primeira classe em termos de codifica\u00e7\u00e3o e decodifica\u00e7\u00e3o JSON. Vejamos cada uma delas mais a fundo.<\/p>\n<h3>Suporte para value classes<\/h3>\n<p><a href=\"https:\/\/kotlinlang.org\/docs\/inline-classes.html\" target=\"_blank\" rel=\"noopener\">Value classes<\/a> (anteriormente chamadas de <em>inline classes<\/em>) s\u00e3o uma maneira de envolver outro tipo Kotlin ( por exemplo, um n\u00famero) com seguran\u00e7a de tipos, sem introduzir sobrecarga de tempo de execu\u00e7\u00e3o adicional. Isso ajuda a tornar seus programas mais expressivos e seguros, sem resultar em penalidades de desempenho.<\/p>\n<p>A serializa\u00e7\u00e3o JSON embutida da <code>kotlinx.serialization<\/code> agora funciona para value classes. Assim como outras classes Kotlin, basta anotar uma <code>value class<\/code> com <code>@Serializable<\/code>.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">@Serializable\nvalue class Color(val rgb: Int)\n<\/pre>\n<p>As value classes s\u00e3o armazenadas (e serializadas) diretamente como seu tipo subjacente. Podemos ver isso adicionando um campo com um tipo de <code>value class<\/code> a uma <code>data class<\/code> serializ\u00e1vel e inspecionando sua sa\u00edda:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">@Serializable\ndata class NamedColor(val color: Color, val name: String)\n\nfun main() {\nprintln(Json.encodeToString(NamedColor(Color(0), \"black\")))\n}\n\n\/\/ {\"color\": 0, \"name\": \"black\"}\n<\/pre>\n<p>No exemplo acima, <code>NamedColor<\/code> trata a <code>value class<\/code> <code>Color<\/code> como <em>primitiva subjacente<\/em> (um <code>Int<\/code>). Isso significa que voc\u00ea pode aproveitar ao m\u00e1ximo a seguran\u00e7a de tipos dentro do seu c\u00f3digo Kotlin e, ao mesmo tempo, se beneficiar de uma representa\u00e7\u00e3o serializada concisa desses tipos, sem delimita\u00e7\u00e3o ou aninhamento desnecess\u00e1rios.<\/p>\n<p>Ainda estamos aperfei\u00e7oando o design para serializadores escritos \u00e0 m\u00e3o e personalizados para value classes. Por enquanto, eles continuam sendo recursos experimentais. Voc\u00ea pode descobrir mais sobre esse t\u00f3pico em <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\">documentos no GitHub<\/a>.<\/p>\n<h3>Suporte para inteiros sem sinal<\/h3>\n<p><a href=\"https:\/\/kotlinlang.org\/docs\/basic-types.html#unsigned-integers\" target=\"_blank\" rel=\"noopener\">Inteiros sem sinal<\/a> s\u00e3o uma adi\u00e7\u00e3o \u00e0 biblioteca padr\u00e3o Kotlin que fornecem tipos e opera\u00e7\u00f5es para <em>n\u00fameros n\u00e3o negativos<\/em>. Com o lan\u00e7amento do Kotlin 1.5.0, os seguintes tipos de n\u00fameros sem sinal est\u00e3o dispon\u00edveis:<\/p>\n<ul>\n<li><code>UByte<\/code>, com valores de 0 a 255<\/li>\n<li><code>UShort<\/code>, com valores de 0 a 65535<\/li>\n<li><code>UInt<\/code>, com valores de 0 0 a 2^32 \u2013 1<\/li>\n<li><code>ULong<\/code>, com valores de 0 a 2^64 \u2013 1<\/li>\n<\/ul>\n<p>O codificador e o decodificador JSON na <code>kotlinx.serialization<\/code> agora oferecem suporte a esses tipos prontos para uso. Assim como outros tipos de n\u00fameros, valores inteiros sem sinal ser\u00e3o serializados em sua representa\u00e7\u00e3o num\u00e9rica simples (a mesma representa\u00e7\u00e3o que voc\u00ea v\u00ea ao invocar <code>.toString<\/code>), sem truncamento, quebra ou convers\u00e3o em tipos com sinal.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">@Serializable\nclass Counter(val counted: UByte, val description: String)\n\n@Serializable\nclass BigCounter(val counted: ULong)\n\nval counted = 239.toUByte()\nprintln(Json.encodeToString(Counter(counted, \"tries\")))\n\/\/ {\"counted\":239,\"description\":\"tries\"}\n\nprintln(Json.encodeToString(BigCounter(ULong.MAX_VALUE)))\n\/\/ {\"counted\":18446744073709551615}\n<\/pre>\n<p>Observe que o suporte para value classes e inteiros sem sinal est\u00e1 dispon\u00edvel atualmente para JSON. Em uma vers\u00e3o futura, tamb\u00e9m forneceremos integra\u00e7\u00f5es diretas para CBOR e Protobuf: fique ligado!<\/p>\n<p>Para acompanhar e ficar em dia com os lan\u00e7amentos futuros da <code>kotlinx.serialization<\/code> e da linguagem de programa\u00e7\u00e3o Kotlin, <em>assine o boletim informativo de atualiza\u00e7\u00f5es de produtos Kotlin<\/em> usando o formul\u00e1rio ao lado desta postagem de blog!<\/p>\n<p>Para obter informa\u00e7\u00f5es mais detalhadas sobre como usar value classes e tipos sem sinal com a <code>kotlinx.serialization<\/code>, confira a <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/inline-classes.md\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o no GitHub<\/a>.<\/p>\n<p><a name=\"alt-names\"><\/a><\/p>\n<h2>Suporte para nomes alternativos em campos JSON<\/h2>\n<p>\u00c0s vezes, voc\u00ea precisa analisar campos JSON que t\u00eam nomes diferentes, mas com o mesmo significado, por exemplo, para manter a compatibilidade com vers\u00f5es anteriores. Com a nova anota\u00e7\u00e3o <code>@JsonNames<\/code>, agora voc\u00ea pode dar nomes alternativos aos campos JSON, que ser\u00e3o usados durante o processo de decodifica\u00e7\u00e3o.<\/p>\n<p>Para ilustrar isso, vejamos um exemplo. Vamos supor que, dependendo da sua vers\u00e3o, um servidor nos retorne uma das seguintes respostas:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">{\"name\":\"kotlinx.serialization\"}\n\/* ...or: *\/\n{\"title\":\"kotlinx.serialization\"}\n<\/pre>\n<p>Tanto <code>name<\/code> quanto <code>title<\/code> t\u00eam o mesmo significado, e queremos mape\u00e1-los para o mesmo campo na nossa classe Kotlin. Com a nova anota\u00e7\u00e3o <code>@JsonNames<\/code>, podemos especificar <code>title<\/code> como uma chave alternativa para a chave <code>name<\/code>:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">@Serializable\ndata class Project(@JsonNames(\"title\") val name: String)\n<\/pre>\n<p>Observe como isso \u00e9 diferente da anota\u00e7\u00e3o <code>@SerialName<\/code>, que permite <em>renomear campos<\/em> para codifica\u00e7\u00e3o e decodifica\u00e7\u00e3o, mas n\u00e3o permite <em>especificar alternativas<\/em>.<\/p>\n<p>Esperamos que esse recurso torne mais f\u00e1cil para voc\u00ea trabalhar com servi\u00e7os que retornam campos com nomes diferentes que representam os mesmos valores, sobreviver a migra\u00e7\u00f5es de esquemas e fornecer atualiza\u00e7\u00f5es elegantes para as suas aplica\u00e7\u00f5es!<\/p>\n<p><a name=\"api-docs\"><\/a><\/p>\n<h2>Documenta\u00e7\u00e3o de APIs atualizada<\/h2>\n<p>Para tornar sua experi\u00eancia de aprendizado da <code>kotlinx.serialization<\/code> a mais confort\u00e1vel e divertida poss\u00edvel, tentamos fornecer a voc\u00ea v\u00e1rios materiais de refer\u00eancia. Um deles \u00e9 o <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/serialization-guide.md\" target=\"_blank\" rel=\"noopener\">Guia de serializa\u00e7\u00e3o Kotlin no GitHub<\/a>, que oferece um passo a passo para a funcionalidade fornecida pela biblioteca e inclui exemplos independentes para fornecer uma compreens\u00e3o intuitiva de cada recurso.<\/p>\n<p>Outro \u00e9 a <a href=\"https:\/\/kotlin.github.io\/kotlinx.serialization\/\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o de APIs da kotlinx.serialization<\/a>, que revisamos completamente. Com base em uma nova vers\u00e3o do <a href=\"https:\/\/github.com\/Kotlin\/dokka\" target=\"_blank\" rel=\"noopener\">Dokka<\/a>, o mecanismo de documenta\u00e7\u00e3o do Kotlin, a nova documenta\u00e7\u00e3o de APIs vem com um novo design responsivo e moderno e s\u00edmbolos de f\u00e1cil navega\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/04\/image1.png\" alt=\"Exemplo dos novos documentos de API, mostrando a documenta\u00e7\u00e3o de JsonElement\"><\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Instalar\" href=\"https:\/\/kotlin.github.io\/kotlinx.serialization\/\" target=\"_blank\" rel=\"noopener\">Explore a nova documenta\u00e7\u00e3o de APIs da kotlinx.serialization!<\/a><\/p>\n<p><a name=\"protobuf-schemas\"><\/a><\/p>\n<h2>Protobuf: gera\u00e7\u00e3o de esquema experimental a partir de classes Kotlin<\/h2>\n<p>O <a href=\"https:\/\/developers.google.com\/protocol-buffers\" target=\"_blank\" rel=\"noopener\">Protocol Buffers<\/a> (Protobuf) \u00e9 um <em>formato de serializa\u00e7\u00e3o bin\u00e1rio<\/em> para dados estruturados criado pelo Google. Como formato bin\u00e1rio, ele \u00e9 mais eficiente em termos de espa\u00e7o do que JSON ou o XML, ao mesmo tempo em que fornece uma <em>estrutura independente de linguagem<\/em> que pode ser usada para comunica\u00e7\u00e3o entre aplica\u00e7\u00f5es.<\/p>\n<p>Com a <code>kotlinx.serialization<\/code>, voc\u00ea pode usar a <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/formats.md#protobuf-experimental\" target=\"_blank\" rel=\"noopener\">serializa\u00e7\u00e3o Protobuf multiplataforma<\/a> (usando a <a href=\"https:\/\/developers.google.com\/protocol-buffers\/docs\/proto\" target=\"_blank\" rel=\"noopener\">sem\u00e2ntica proto2<\/a>) com estabilidade <em>experimental<\/em>. Como os outros formatos, voc\u00ea anota sua classe como <code>@Serializable<\/code> e usa os m\u00e9todos internos <code>encode<\/code>\/<code>decode<\/code>:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">@Serializable\ndata class Project(val name: String, val language: String)\n\nfun main() {\nval data = Project(\"kotlinx.serialization\", \"Kotlin\")\nval bytes = ProtoBuf.encodeToByteArray(data)\nprintln(bytes.toAsciiHexString())\nval obj = ProtoBuf.decodeFromByteArray(bytes)\nprintln(obj)\n}\n<\/pre>\n<p>Com as suas classes Kotlin como <em>&#8220;source of truth&#8221;<\/em> &#8211; fonte de dados \u00fanica e confi\u00e1vel &#8211; (junto com quaisquer <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/formats.md#protobuf-experimental\" target=\"_blank\" rel=\"noopener\">personaliza\u00e7\u00f5es<\/a> que voc\u00ea possa querer aplicar), a <code>kotlinx.serialization<\/code> \u00e9 capaz de inferir o esquema bin\u00e1rio dos dados, tornando a comunica\u00e7\u00e3o do Protobuf <em>entre v\u00e1rias aplica\u00e7\u00f5es Kotlin<\/em> concisa e conveniente.<\/p>\n<p>A <code>kotlinx.serialization<\/code> 1.2 agora tamb\u00e9m inclui um <em>gerador de esquema experimental para Protocol Buffers<\/em>. Esse gerador permite que voc\u00ea gere arquivos <code>.proto<\/code> a partir das suas data classes Kotlin, que, por sua vez, podem ser usadas para gerar representa\u00e7\u00f5es do seu esquema de comunica\u00e7\u00e3o em outras linguagens, incluindo Python, C++ e TypeScript.<\/p>\n<p>Para obter instru\u00e7\u00f5es sobre como come\u00e7ar a trabalhar com o novo gerador de esquema, confira as instru\u00e7\u00f5es correspondentes na <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/formats.md#protobuf-experimental\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o<\/a>.<\/p>\n<p>Depois que o arquivo <code>.proto<\/code> for gerado, voc\u00ea poder\u00e1 armazen\u00e1-lo no seu reposit\u00f3rio e us\u00e1-lo para gerar representa\u00e7\u00f5es das suas classes Kotlin em outras linguagens. Esperamos que isso torne mais f\u00e1cil para voc\u00ea usar a integra\u00e7\u00e3o Protobuf da <code>kotlinx.serialization<\/code> em <em>aplica\u00e7\u00f5es compat\u00edveis com v\u00e1rias linguagens<\/em> sem precisar abrir m\u00e3o da conveni\u00eancia de gerenciar seus esquemas diretamente no c\u00f3digo-fonte do Kotlin.<\/p>\n<p>Como esta \u00e9 a <em>primeira itera\u00e7\u00e3o<\/em> do gerador de esquema Protobuf, contamos muito com o seu feedback. Experimente e conte-nos sobre seus casos de uso, como voc\u00ea gerencia seus modelos e arquivos <code>.proto<\/code>, quaisquer problemas que encontrar e os recursos que gostaria de ver. Para isso, use o <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/issues\" target=\"_blank\" rel=\"noopener\">Rastreador de issues do GitHub<\/a>.<\/p>\n<p>Ao trabalhar com o gerador de esquema, tenha em mente algumas de suas limita\u00e7\u00f5es. Como regra geral, se uma classe Kotlin puder ser serializada com a implementa\u00e7\u00e3o do Protobuf inclu\u00edda com a <code>kotlinx.serialization<\/code>, o gerador de esquema fornecer\u00e1 suporte para essa classe. Isso tamb\u00e9m significa que as <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\">mesmas restri\u00e7\u00f5es<\/a> s\u00e3o aplic\u00e1veis. Aqui est\u00e3o alguns pontos a serem observados:<\/p>\n<ul>\n<li><em>Classes e nomes de propriedades<\/em> Kotlin precisam estar em conformidade com a <a href=\"https:\/\/developers.google.com\/protocol-buffers\/docs\/reference\/proto2-spec\" target=\"_blank\" rel=\"noopener\">especifica\u00e7\u00e3o protobuf<\/a> e n\u00e3o devem conter caracteres ilegais.<\/li>\n<li>A <em>nulidade<\/em> do Kotlin n\u00e3o se reflete no esquema (porque o proto2 n\u00e3o tem sem\u00e2ntica para isso). <em>Campos opcionais<\/em> fornecidos por protocol buffers s\u00e3o usados com base no fato de suas propriedades Kotlin definirem ou n\u00e3o <em>valores padr\u00e3o<\/em>.<\/li>\n<li>Os <em>valores padr\u00e3o<\/em> do Kotlin n\u00e3o est\u00e3o inclu\u00eddos no esquema. (o que significa que voc\u00ea ter\u00e1 que garantir a consist\u00eancia dos padr\u00f5es em diferentes implementa\u00e7\u00f5es da linguagem por conta pr\u00f3pria.)<\/li>\n<\/ul>\n<p><a name=\"start-using\"><\/a><\/p>\n<h2>Comece a usar a kotlinx.serialization 1.2!<\/h2>\n<p>Isso conclui nossa vis\u00e3o geral. Se voc\u00ea est\u00e1 pronto para <em>aproveitar a codifica\u00e7\u00e3o e a decodifica\u00e7\u00e3o JSON mais r\u00e1pidas, o suporte para adi\u00e7\u00f5es de sistema do tipo Kotlin 1.5, a gera\u00e7\u00e3o de esquema Protobuf e muitas outras vantagens<\/em>, \u00e9 hora de atualizar!<\/p>\n<p>Se voc\u00ea j\u00e1 est\u00e1 usando a <code>kotlinx.serialization<\/code>, \u00e9 muito r\u00e1pido fazer o upgrade para a vers\u00e3o 1.2 (e se voc\u00ea nunca experimentou a <code>kotlinx.serialization<\/code>, agora \u00e9 a ocasi\u00e3o ideal para come\u00e7ar). Primeiro, atualize o bloco <code>plugins<\/code> no seu arquivo <code>build.gradle.kts<\/code>:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">plugins {\nkotlin(\"jvm\") version \"1.5.0\" \/\/ or kotlin(\"multiplatform\") or any other kotlin plugin\nkotlin(\"plugin.serialization\") version \"1.5.0\"\n}\n<\/pre>\n<p>Em seguida, atualize seu bloco <code>dependencies<\/code> com a biblioteca de tempo de execu\u00e7\u00e3o, incluindo os formatos que voc\u00ea deseja usar na sua aplica\u00e7\u00e3o:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">dependencies {\nimplementation(\"org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.1\")\nimplementation(\"org.jetbrains.kotlinx:kotlinx-serialization-protobuf:1.2.1\")\n\/\/ . . .\n}\n<\/pre>\n<h2>Assista e leia mais<\/h2>\n<ul>\n<li><a href=\"https:\/\/youtu.be\/698I_AH8h6s\" target=\"_blank\" rel=\"noopener\">v\u00eddeo sobre a kotlinx.serialization 1.2<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/\" target=\"_blank\" rel=\"noopener\">Biblioteca no GitHub<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/serialization-guide.md\" target=\"_blank\" rel=\"noopener\">guia para a kotlinx.serialization<\/a><\/li>\n<li><a href=\"https:\/\/kotlin.github.io\/kotlinx.serialization\/\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o de APIs<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlin-1-5-0-released\/\">postagem de blog sobre o lan\u00e7amento do Kotlin 1.5.0<\/a><\/li>\n<\/ul>\n<h3>Se voc\u00ea tiver algum problema<\/h3>\n<ul>\n<li>Informe issues no <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/issues\" target=\"_blank\" rel=\"noopener\">rastreador de issues do GitHub<\/a>.<\/li>\n<li>Procure ajuda no canal #serialization do Kotlin no Slack (<a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up\" target=\"_blank\" rel=\"noopener\">receba um convite<\/a>).<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.youtube.com\/channel\/UCP7uiEZIqci43m22KDl0sNw?sub_confirmation=1\" target=\"_blank\" rel=\"noopener\">Assina o canal do Kotlin no YouTube!<\/a> Boas (des)serializa\u00e7\u00f5es!<\/p>\n","protected":false},"author":1086,"featured_media":137331,"comment_status":"closed","ping_status":"closed","template":"","categories":[909],"tags":[671],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/143637"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=143637"}],"version-history":[{"count":3,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/143637\/revisions"}],"predecessor-version":[{"id":143640,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/143637\/revisions\/143640"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/137331"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=143637"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=143637"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=143637"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=143637"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}