JSON ou Serialize: qual escolher para armazenar arrays PHP? (guia completo)

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: o dilema eterno do desenvolvedor PHP

\n\n

Todo 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.

\n\n

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\n

O que é serialização em PHP?

\n\n

Serializaçã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\n

O 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
\n\n

À primeira vista, ambos fazem a mesma coisa. Mas o diabo, como sempre, está nos detalhes.

\n\n

Exemplo 1: Array associativo simples

\n\n

Vamos 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\n

Já 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.

\n\n

Exemplo 2: Array multidimensional

\n\n

Vamos 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\n

Conclusão: O JSON geralmente é mais compacto, especialmente para arrays grandes. Isso é crítico ao armazenar em banco de dados ou transmitir pela rede.

\n\n

Desempenho: qual é mais rápido?

\n\n

Velocidade é 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\n

Resultados (no PHP 8.2):

\n
    \n
  • Serialize: ~1.8 seg
  • \n
  • JSON: ~1.2 seg
  • \n
\n\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\n

Segurança: um ponto crítico

\n\n

Aqui 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).

\n\n

Por outro lado, json_decode() é muito mais seguro — ele apenas cria arrays ou objetos simples, sem risco de execução de código.

\n\n

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.

\n\n

Compatibilidade: JSON vence

\n\n

O 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.

\n\n

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\n

Quando usar serialize()?

\n\n

Apesar das desvantagens, o serialize() tem seus casos de uso:

\n\n
    \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
\n\n

Tabela comparativa final

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Critérioserialize()json_encode()
LegibilidadeBaixaAlta
TamanhoMaiorMenor
VelocidadeMais lentoMais rápido
SegurançaPerigoso com dados externosSeguro
CompatibilidadeApenas PHPUniversal
Suporte a objetosCompletoLimitado
\n\n

Conclusão: qual escolher?

\n\n

Para 90% dos casos, json_encode() / json_decode() é a melhor escolha. É mais rápido, mais seguro, mais compacto e universalmente compatível.

\n\n

Reserve serialize() para situações específicas onde você precisa preservar objetos complexos do PHP ou trabalhar com dados estritamente internos.

\n\n

E você, qual método prefere? Deixe seu comentário abaixo e compartilhe sua experiência!

Blogs

Book Recommendations