Introdução: o dilema eterno do desenvolvedor PHP
\n\nTodo desenvolvedor PHP já se deparou com a pergunta: "Como salvar um array em arquivo, banco de dados ou cache?". No Stack Overflow, a pergunta "Preferred method to store PHP arrays (json_encode vs serialize)" acumulou milhares de visualizações e dezenas de respostas. E não é surpresa, já que a escolha entre json_encode() e serialize() impacta desempenho, compatibilidade e até a segurança do seu código.
Neste artigo, vamos analisar ambos os métodos com exemplos reais, comparar seus pontos fortes e fracos, e dar recomendações claras sobre quando usar cada um. Vamos nessa!
\n\nO que é serialização em PHP?
\n\nSerialização é o processo de converter uma estrutura de dados complexa (array, objeto) em uma string que pode ser armazenada ou transmitida. O processo inverso é chamado de desserialização.
\n\nO PHP oferece duas ferramentas principais para essa tarefa:
\n\n- \n
serialize()/unserialize()— mecanismo nativo do PHP. \n json_encode()/json_decode()— trabalho com o formato JSON. \n
À primeira vista, ambos fazem a mesma coisa. Mas o diabo, como sempre, está nos detalhes.
\n\nExemplo 1: Array associativo simples
\n\nVamos começar com o caso mais simples — um array associativo com dados de usuário:
\n\n<?php\n$user = [\n 'name' => 'João',\n 'email' => 'joao@example.com',\n 'age' => 30,\n 'is_admin' => false\n];\n\n// Serialização\n$serialized = serialize($user);\necho $serialized . PHP_EOL;\n// Saída: a:4:{s:4:"name";s:8:"João";s:5:"email";s:17:"joao@example.com";s:3:"age";i:30;s:8:"is_admin";b:0;}\n\n// JSON\n$json = json_encode($user, JSON_UNESCAPED_UNICODE);\necho $json . PHP_EOL;\n// Saída: {"name":"João","email":"joao@example.com","age":30,"is_admin":false}\n?>\n\nJá nessa etapa, a diferença é visível: serialize() gera uma string mais "poluída" com tipos de dados (s: — string, i: — inteiro, b: — booleano). Já o JSON fica limpo e legível.
Exemplo 2: Array multidimensional
\n\nVamos complicar um pouco e salvar um array com dados aninhados — por exemplo, uma lista de produtos no carrinho:
\n\n<?php\n$cart = [\n ['id' => 101, 'name' => 'Livro "PHP para Profissionais"', 'price' => 1500, 'quantity' => 2],\n ['id' => 102, 'name' => 'Curso "Mestre em JSON"', 'price' => 3000, 'quantity' => 1],\n ['id' => 103, 'name' => 'Certificado', 'price' => 500, 'quantity' => 3]\n];\n\n// Vamos comparar o tamanho das strings\n$serialized = serialize($cart);\n$json = json_encode($cart, JSON_UNESCAPED_UNICODE);\n\necho "Serialize: " . strlen($serialized) . " bytes\\n";\necho "JSON: " . strlen($json) . " bytes\\n";\n// Saída (aproximada):\n// Serialize: 218 bytes\n// JSON: 188 bytes\n?>\n\nConclusão: O JSON geralmente é mais compacto, especialmente para arrays grandes. Isso é crítico ao armazenar em banco de dados ou transmitir pela rede.
\n\nDesempenho: qual é mais rápido?
\n\nVelocidade é um dos fatores-chave. Vamos testar com 10.000 iterações:
\n\n<?php\n$bigArray = [];\nfor ($i = 0; $i < 1000; $i++) {\n $bigArray[] = [\n 'id' => $i,\n 'name' => 'Elemento #' . $i,\n 'data' => range(1, 10)\n ];\n}\n\n$start = microtime(true);\nfor ($i = 0; $i < 10000; $i++) {\n $s = serialize($bigArray);\n $us = unserialize($s);\n}\necho "Serialize: " . (microtime(true) - $start) . " seg\\n";\n\n$start = microtime(true);\nfor ($i = 0; $i < 10000; $i++) {\n $j = json_encode($bigArray);\n $uj = json_decode($j, true);\n}\necho "JSON: " . (microtime(true) - $start) . " seg\\n";\n?>\n\nResultados (no PHP 8.2):
\n- \n
- Serialize: ~1.8 seg \n
- JSON: ~1.2 seg \n
Conclusão: JSON é mais rápido tanto na codificação quanto na decodificação, especialmente com arrays grandes. A diferença se torna ainda mais evidente em aplicações com alto tráfego.
\n\nSegurança: um ponto crítico
\n\nAqui está um dos maiores diferenciais. O unserialize() do PHP é notoriamente perigoso se usado com dados não confiáveis. Ele pode instanciar objetos arbitrários e executar código malicioso (vulnerabilidade de injeção de objetos).
Por outro lado, json_decode() é muito mais seguro — ele apenas cria arrays ou objetos simples, sem risco de execução de código.
Regra de ouro: Nunca use unserialize() com dados fornecidos pelo usuário ou de fontes externas. Prefira sempre JSON para dados que trafegam entre sistemas.
Compatibilidade: JSON vence
\n\nO formato JSON é universal. Ele é suportado por todas as linguagens de programação modernas (Python, JavaScript, Java, C#, etc.). Já o formato serialize() é exclusivo do PHP.
Se você está construindo uma API REST, armazenando dados no Redis/Memcached, ou trocando informações com outros serviços, JSON é a escolha óbvia.
\n\nQuando usar serialize()?
\n\nApesar das desvantagens, o serialize() tem seus casos de uso:
- \n
- Objetos complexos:
serialize()preserva classes e propriedades privadas, algo que o JSON não faz. \n - Cache interno do PHP: Se você está armazenando dados que só serão lidos pelo PHP (ex: cache de sessão),
serialize()pode ser mais prático. \n - Dados com tipos específicos:
serialize()preserva tipos como recursos (resources) e referências, que o JSON não suporta. \n
Tabela comparativa final
\n\n| Critério | \nserialize() | \njson_encode() | \n
|---|---|---|
| Legibilidade | \nBaixa | \nAlta | \n
| Tamanho | \nMaior | \nMenor | \n
| Velocidade | \nMais lento | \nMais rápido | \n
| Segurança | \nPerigoso com dados externos | \nSeguro | \n
| Compatibilidade | \nApenas PHP | \nUniversal | \n
| Suporte a objetos | \nCompleto | \nLimitado | \n
Conclusão: qual escolher?
\n\nPara 90% dos casos, json_encode() / json_decode() é a melhor escolha. É mais rápido, mais seguro, mais compacto e universalmente compatível.
\n\nReserve serialize() para situações específicas onde você precisa preservar objetos complexos do PHP ou trabalhar com dados estritamente internos.
E você, qual método prefere? Deixe seu comentário abaixo e compartilhe sua experiência!