Além do que as outras respostas disseram:
Às vezes, você deseja serializar coisas que não são dados puros.
Por exemplo, pense em um identificador de arquivo ou uma conexão com um servidor. Embora o identificador ou o soquete do arquivo seja um int
, esse número não faz sentido na próxima vez que o programa for executado. Para recriar adequadamente objetos que contêm identificadores para essas coisas, é necessário reabrir arquivos e recriar conexões e decidir o que fazer se isso falhar.
Atualmente, muitos idiomas suportam o armazenamento de funções anônimas em objetos, por exemplo, um onBlah()
manipulador em Javascript. Isso é desafiador, porque esse código pode conter referências a dados adicionais que, por sua vez, precisam ser serializados. (E há o problema de serializar código de uma forma multiplataforma, o que é obviamente mais fácil para idiomas interpretados.) Ainda assim, mesmo que apenas um subconjunto do idioma possa ser suportado, ele ainda pode ser bastante útil. Não há muitos mecanismos de serialização que tentam serializar código, mas consulte serialize-javascript .
Nos casos em que você deseja serializar um objeto, mas ele contém algo que não é suportado pelo seu mecanismo de serialização, é necessário reescrever o código de maneira a solucionar esse problema. Por exemplo, você pode usar enumerações no lugar de funções anônimas quando houver um número finito de funções possíveis.
Geralmente, você deseja que os dados serializados sejam concisos.
Se você estiver enviando dados pela rede ou mesmo armazenando-os em disco, pode ser importante manter o tamanho pequeno. Uma das maneiras mais fáceis de conseguir isso é jogar fora as informações que podem ser reconstruídas (por exemplo, descartando caches, tabelas de hash e representações alternativas dos mesmos dados).
Obviamente, o programador precisa selecionar manualmente o que deve ser salvo e o que deve ser descartado e garantir que as coisas sejam reconstruídas quando o objeto for recriado.
Pense no ato de salvar um jogo. Os objetos podem conter muitos ponteiros para dados gráficos, dados de som e outros objetos. Mas a maioria dessas coisas pode ser carregada dos arquivos de dados do jogo e não precisa ser armazenada em um arquivo salvo. Descartar isso pode ser trabalhoso, então poucas coisas são deixadas. Eu editei hexadecimalmente alguns arquivos salvos no meu tempo e descobri dados claramente redundantes, como descrições de itens de texto.
Às vezes, o espaço não é importante, mas a legibilidade é - nesse caso, você pode usar um formato ASCII (possivelmente JSON ou XML).