Guia para serialização C ++

Guia para serialização C ++
A serialização converte um objeto em um fluxo de bytes a ser armazenado no disco ou enviado para outro computador através de uma rede. Existem dois tipos de objetos em C ++: objetos e objetos fundamentais instanciados de uma classe definida. Nota, em C ++, a estrutura é considerada uma classe e o nome de uma estrutura representa o objeto instanciado da estrutura.

Objetos fundamentais individuais não são normalmente serializados. No entanto, como um objeto instanciado possui objetos fundamentais, como todo o objeto é serializado, os objetos fundamentais também são serializados. Em C ++, todas as estruturas de dados, como o vetor, são classes predefinidas.

A serialização também é chamada de mareclamento. O oposto da serialização é a deserialização ou o solo. O objeto serializado como um arquivo do disco ou da rede pode ser convertido de volta (ressuscitado) no objeto no computador local para ser usado com o aplicativo C ++ local (programa).

Este artigo o orienta para entender melhor as bibliotecas de serialização do C ++ e como escrever sua própria biblioteca de serialização. Está focado no fluxo padrão serializado, JSON - veja abaixo.

Conteúdo do artigo

  • Binário e fluxo de texto
  • Objetivos principais
  • JSON Stream
  • Sintaxe JSON
  • Valor de dados JSON
  • Comparando objetos C ++ e JSON
  • Mais para saber
  • Conclusão

Binário e fluxo de texto

Binário
Diz -se que um programa C ++ compilado está em forma binária. Um fluxo serializado pode ser em forma binária. No entanto, este artigo não considerará objetos serializados binários.

Texto
O fluxo serializado pode estar em forma de texto. Dois padrões de texto usados ​​hoje são JSON e XML. É mais fácil entender e lidar com JSON do que entender e lidar com XML. Então JSON é usado neste artigo.

Objetivos principais

Os principais objetivos da serialização são que o fluxo serializado deve ser compatível com antecedência e para o futuro compatível. Também deve ser possível ser usado em diferentes sistemas operacionais e diferentes arquiteturas de computador.

Versão
Suponha que você escreveu um programa e o enviou para um cliente, e o cliente está satisfeito. Está bem. Mais tarde, o cliente precisa de modificação. No entanto, hoje, o cliente empregou seu próprio programador. O programador pede que você adicione outra propriedade (membro de dados) a uma classe e envie os objetivos correspondentes através da rede. Ele pretende se encaixar no objeto no programa; Quando você faz isso, o fluxo serializado terá que ser compatível com o objeto antigo.

A especificação de C ++ e outros idiomas mudam ao longo do tempo. Em algumas especificações, você é informado de algumas das mudanças que ocorrerão nas especificações seguintes e futuras. Normalmente não é possível informá -lo de todas as mudanças que acontecerão. Portanto, seu fluxo serializado deve ser compatível com antecedência, desde que essas novas mudanças futuras estejam preocupadas. A compatibilidade avançada tem seus limites porque nem todas as mudanças futuras podem ser determinadas.

A compatibilidade para frente e para trás é tratada pelo esquema chamado versão.

JSON Stream

JSON significa notação de objeto JavaScript.

JSON é um formato de texto para armazenar e transportar dados.

JSON é "auto-descrição".

O JSON também é um padrão antigo e, portanto, se adequa bem à serialização do texto C ++. Então, para enviar um objeto instanciado C ++, converta -o em um objeto JSON e envie. Pouco antes de o objeto JSON ser enviado, ele é chamado de fluxo. Quando um objeto JSON é recebido em sua sequência, ele ainda é chamado de riacho para deserivação.

Sintaxe JSON

Com JSON, um dado é um par de chaves/valor. Por exemplo, em

"Nome": "Smith"

nome é uma chave, e Smith é o valor. Um objeto é delimitado por aparelhos, como em:

"Nome": "Smith", "Height": 1.7

Os dados são separados por vírgulas. Qualquer texto, seja uma chave ou um valor, deve estar em duplas. Os números são escritos sem cotações.

Uma matriz é delimitada por colchetes como em:

["Orange", "Banana", "Pear", "Lemon"]

No código a seguir, há um dado cujo valor é uma matriz e identificado pelo ARR

"arr": ["laranja", "banana", "pêra", "limão"]

Nota: Os objetos podem ser aninhados em JSON e, com isso, os objetos podem ser identificados.

Valor de dados JSON

O Valor JSON de Datum JSON é:

  • uma linha
  • um número
  • um objeto
  • uma matriz
  • um booleano
  • nulo
  • uma função (mas em citações duplas)

Uma data de C ++ ou qualquer outro objeto que não esteja nesta lista deve ser convertido em uma string literal para se tornar um valor JSON.

Comparando objetos C ++ e JSON

A seguir, é apresentado um programa C ++ simples com um objeto simples, do construtor padrão:

#incluir
usando namespace std;
CLASSE THECLA

público:
int num;
int mthd (int it)

devolver;

;
int main ()

Thecla obj;
int no = obj.MTHD (3);
cout << no << endl;
retornar 0;

O objeto JSON equivalente é o seguinte:

"obj": "num": null, "mthd": "int mthd (int it) return It;"

Um objeto JSON é, por definição, serializado.

Observe como o nome do objeto foi indicado. Além disso, observe como o nome da função foi indicado. No final do recebimento, o programa C ++ para a deserivização terá que convertê -lo em uma classe e objeto C ++ e depois compilar. O programa também terá que reconhecer a função em forma de string, remover as citações duplas e ter a função como texto antes de compilar.

Para facilitar isso, os metadados devem ser enviados. Metadados são dados sobre dados. Um mapa C ++ com os metadados pode ser enviado. Um mapa é um objeto C ++, que terá que ser convertido em um objeto JSON. Será enviado, seguido pelo objeto de interesse JSON.

O objeto JSON é um objeto de fluxo. Depois de preparado, ele deve ser enviado ao objeto C ++ Ostream a ser salvo como um arquivo ou enviado pela rede. No computador receptor, o C ++ ISTREAM receberá a sequência. Em seguida, será tomado pelo programa de deserialização que reproduzirá o objeto em formato C ++. Ostream e istream são objetos de C ++ FStream.

NOTA: Em JavaScript (ECMAScript), a serialização é chamada, rigificar e deserialização é chamado de análise.

Objeto JSON e objeto JavaScript

Objeto JSON e objeto JavaScript são semelhantes. O objeto JavaScript tem menos restrições do que o objeto JSON. O objeto JSON foi projetado a partir do objeto JavaScript, mas hoje pode ser usado por muitas outras linguagens do computador. JSON é o arquivo mais comum (sequência serializada) usada para enviar dados entre os servidores da Web e seus clientes. As bibliotecas C ++ usam JSON, mas nenhuma delas satisfaz a maioria dos objetivos de produzir um arquivo para C++.

Nota: Em JavaScript, uma função não é uma string. Qualquer função recebida como uma string é convertida em uma função de sintaxe normal.

Mais para saber

Além de conhecer o exposto acima, a fim de produzir uma biblioteca de serialização ou desserialização por si mesmo, você também deve saber:

  • Como expressar os indicadores de C ++ em formato JSON;
  • como expressar herança de C ++ no formato JSON;
  • como expressar o polimorfismo de C ++ em formato JSON; e
  • Mais sobre JSON.

Conclusão

A serialização converte um objeto em um fluxo de bytes a ser armazenado no disco ou enviado para outro computador através de uma rede. Desserialização é o processo revertido para o fluxo serializado, que é chamado de arquivo.

Objetos fundamentais e objetos instantados podem ser serializados. Objetos fundamentais únicos são dificilmente serializados. No entanto, como um objeto instanciado possui objetos fundamentais, objetos fundamentais são serializados ao lado de todo.

A serialização tem uma desvantagem de que expõe membros particulares do objeto C ++. Este problema pode ser resolvido fazendo serialização em binário. Com o texto, os metadados podem ser enviados para indicar os membros privados; Mas o programador do outro lado ainda pode conhecer os membros particulares.

Você já deve ter salvado no disco ou enviado um programa binário ou de código -fonte através do email, e pode estar se perguntando: por que salvar ou enviar apenas o objeto. Bem, em C ++, você pode ter percebido que toda uma biblioteca pode consistir em apenas uma classe, possivelmente com alguma herança. A classe pode ser mais longa do que muitos programas curtos de C ++. Portanto, um motivo para enviar objetos é porque alguns objetos são muito grandes. A programação orientada a objetos (OOP) envolve a interação de objetos, semelhante a como animais, plantas e ferramentas interagem. Outro motivo é que o OOP está melhorando e os programadores preferem lidar com objetos do que todo o aplicativo, o que pode ser muito grande.

C ++ ainda não possui um formato de arquivo padrão para texto ou binário, embora existam bibliotecas de serialização para serialização e deserialização de C ++. Nenhum deles é realmente satisfatório. O formato de arquivo de texto para JavaScript é JSON. JSON pode ser usado com qualquer linguagem de computador. Portanto, com o guia acima, você poderá produzir sua própria biblioteca para o marechaling C ++ e o UNARSHALLING.