É possível serializar e desserializar uma classe em C ++?
Uso Java há 3 anos e a serialização / desserialização é bastante trivial nessa linguagem. O C ++ possui recursos semelhantes? Existem bibliotecas nativas que lidam com serialização?
Um exemplo seria útil.
c++
serialization
Agusti-N
fonte
fonte
Respostas:
A
Boost::serialization
biblioteca lida com isso de maneira bastante elegante. Eu usei em vários projetos. Há um exemplo de programa, mostrando como usá-lo, aqui .A única maneira nativa de fazer isso é usar fluxos. Isso é essencialmente tudo o que a
Boost::serialization
biblioteca faz, estende o método stream configurando uma estrutura para gravar objetos em um formato semelhante a texto e lê-los no mesmo formato.Para tipos internos, ou seus próprios tipos, com
operator<<
eoperator>>
definidos adequadamente, isso é bastante simples; consulte as Perguntas frequentes sobre C ++ para obter mais informações.fonte
Percebo que este é um post antigo, mas é um dos primeiros que aparece ao procurar
c++ serialization
.Encorajo qualquer pessoa que tenha acesso ao C ++ 11 a dar uma olhada no cereal , uma biblioteca somente de cabeçalho C ++ 11 para serialização que suporta binário, JSON e XML fora da caixa. cereal foi projetado para ser fácil de estender e usar e tem uma sintaxe semelhante ao Boost.
fonte
O impulso é uma boa sugestão. Mas se você gostaria de fazer o seu próprio, não é tão difícil.
Basicamente, você só precisa de uma maneira de criar um gráfico de objetos e enviá-los para algum formato de armazenamento estruturado (JSON, XML, YAML, o que for). Construir o gráfico é tão simples quanto utilizar um algoritmo de marcação de objetos decentes recursivos e, em seguida, gerar todos os objetos marcados.
Escrevi um artigo descrevendo um sistema de serialização rudimentar (mas ainda poderoso). Você pode achar interessante: Usando o SQLite como um formato de arquivo em disco, parte 2 .
fonte
Tanto quanto "built-in" bibliotecas ir, o
<<
e>>
foram reservadas especificamente para serialização.Você deve substituir
<<
para enviar seu objeto para algum contexto de serialização (geralmente umiostream
) e>>
ler os dados novamente a partir desse contexto. Cada objeto é responsável pela saída de seus objetos filhos agregados.Esse método funciona bem desde que o gráfico do objeto não contenha ciclos.
Se isso acontecer, você precisará usar uma biblioteca para lidar com esses ciclos.
fonte
<<
operadores implementados são usados para imprimir representações de objetos legíveis por humanos, o que muitas vezes não é o que você deseja para serialização.<<
o genéricoostream
, tente defini-lo para um fluxo de arquivos.<<
o objeto em algum contexto de serialização… Cada objeto é responsável por produzir o seu…” - a questão é sobre como evitar ter que escrever isso laboriosamente para cada objeto: quanto pode ajuda de idiomas ou bibliotecas?Eu recomendo buffers de protocolo do Google . Tive a chance de testar a biblioteca de um novo projeto e é incrivelmente fácil de usar. A biblioteca é altamente otimizada para desempenho.
O Protobuf é diferente de outras soluções de serialização mencionadas aqui no sentido de que não serializa seus objetos, mas gera código para objetos que são serializados de acordo com sua especificação.
fonte
O Boost :: serialization é uma ótima opção, mas encontrei um novo projeto: Cereal, que acho muito mais elegante! Eu sugiro investigar isso.
fonte
Você pode verificar o protocolo amef , um exemplo de codificação C ++ no amef seria como,
Decodificar em java seria como,
A implementação do protocolo tem codecs para C ++ e Java, a parte interessante é que ele pode reter a representação da classe de objeto na forma de pares de nome e valor, eu exigi um protocolo semelhante no meu último projeto, quando eu tropecei acidentalmente nesse protocolo, eu realmente tinha modifiquei a biblioteca base de acordo com meus requisitos. Espero que isso ajude você.
fonte
Eu recomendo usar a serialização de impulso, conforme descrito por outros pôsteres. Aqui está um bom tutorial detalhado sobre como usá-lo, que complementa bem os tutoriais de reforço: http://www.ocoudert.com/blog/2011/07/09/a-practical-guide-to-c-serialization/
fonte
Sweet Persist é outro.
É possível serializar de e para fluxos nos formatos XML, JSON, Lua e binário.
fonte
Eu sugiro olhar para fábricas abstratas que são frequentemente usadas como base para serialização
Eu respondi em outra pergunta SO sobre fábricas C ++. Por favor, veja lá se uma fábrica flexível é de seu interesse. Eu tento descrever uma maneira antiga do ET ++ para usar macros que funcionou muito bem para mim.
O ET ++ foi um projeto para portar o MacApp antigo para C ++ e X11. No esforço disso, Eric Gamma etc começou a pensar em Design Patterns . O ET ++ continha maneiras automáticas de serialização e introspecção em tempo de execução.
fonte
Se você deseja um desempenho simples e melhor e não se preocupa com a compatibilidade de dados com versões anteriores, tente o HPS , é leve, muito mais rápido que o Boost, etc, e muito mais fácil de usar que o Protobuf, etc.
Exemplo:
fonte
Aqui está uma biblioteca serializadora simples que eu encerrei. É apenas o cabeçalho c11 e tem exemplos para serializar tipos básicos. Aqui está um para um mapa para a aula.
https://github.com/goblinhack/simple-c-plus-plus-serializer
Resultado:
fonte
Estou usando o seguinte modelo para implementar a serialização:
Aqui
T
está o tipo que você deseja serializarMode
é um tipo fictício para diferenciar entre diferentes tipos de serialização, por exemplo. o mesmo número inteiro pode ser serializado como little endian, big endian, varint etc.Por padrão,
Serializer
delega a tarefa ao objeto que está sendo serializado. Para tipos incorporados, você deve fazer uma especialização de modelo doSerializer
.Modelos de função de conveniência também são fornecidos.
Por exemplo, pequena serialização endiana de números inteiros não assinados:
Em seguida, para serializar:
Para desserializar:
Devido à lógica abstrata do iterador, ele deve funcionar com qualquer iterador (por exemplo, iteradores de fluxo), ponteiro, etc.
fonte