O conceito
1. A serialização de dados é converter um objeto ou estrutura de dados em um formato específico, para que possa ser transmitido na rede ou armazenado na memória ou em um arquivo.
2. Desserialização é a operação oposta, o objeto é dados serializados. O foco da serialização de dados restaurada
nos dados é a troca e transmissão de dados
Medida
1. Tamanho dos dados após a serialização. Como os dados serializados precisam ser transmitidos pela rede ou armazenados na memória ou nos arquivos, quanto menor a quantidade de dados, menor o tempo necessário para armazenar ou transmitir
2. O tempo e o consumo de CPU de serialização e desserialização da CPU.
Se ele pode cruzar idiomas ou plataformas. Porque no desenvolvimento atual da empresa, um projeto geralmente usa linguagens diferentes para arquitetura e implementação. Então, em um sistema de rede heterogêneo, os dois lados da rede podem usar linguagens diferentes ou sistemas operacionais diferentes, por exemplo, Java é usado em uma extremidade e C ++ é usado na outra; ou Windows é usado em uma extremidade e o outro é usado na outra extremidade. É um sistema Linux e, dessa vez, exige que os dados serializados sejam analisados e transmitidos entre diferentes idiomas e plataformas diferentes
Problemas com o mecanismo nativo de serialização / desserialização do Java
1. A serialização nativa do Java não pode assumir a estrutura do objeto, o que resulta em uma grande quantidade de dados ao serializar vários objetos.No uso
da serialização nativa do Java, o objeto é analisado e analisado de acordo com o formato especificado por Java. É um formato de bytecode, portanto, quando outros idiomas recebem esse objeto no momento, ele não pode ser analisado ou é mais difícil de analisar. Ou seja, o mecanismo de serialização nativo do Java não é usado em idiomas ou plataformas.
Estrutura de serialização comum (Avro)
O conceito
1. O Avro é uma estrutura de serialização de chamada e procedimento de procedimento remoto, desenvolvida no projeto Apache Hadoop
2. Ele usa JSON para definir tipos de dados e protocolos de comunicação e usa formato binário compactado para serializar dados
. Usado no Hadoop, ele pode fornecer um formato serializado para dados persistentes e um formato de telegrama para comunicação entre nós do Hadoop e de programas clientes para serviços do Hadoop
através do avro, serializados a cada vez, de acordo com o esquema (esquema ) Arquivos para serializar, podem melhorar o desempenho
Funcionalidades
1. Tipos de estrutura de dados avançados, 8 tipos de dados básicos e 6 tipos complexos
2. Formulário binário compressível rápido
3. Fornece arquivos de contêiner para dados persistentes
4. Chamada de procedimento remoto RPC framework
, função dinâmica simples de combinação de idioma, Depois de combinar o Avro e as linguagens dinâmicas, nem a leitura ou gravação de arquivos de dados nem o uso do protocolo RPC requerem geração de código, e a geração de código como uma otimização opcional vale a pena implementar apenas em linguagens estaticamente tipadas. A geração de código como uma otimização opcional só vale a pena implementar em uma linguagem de tipo estaticamente
Tipo simples
Tipo de dados | Explicação |
nulo | Sem valor |
boleano | Um booleano binário |
int | Número inteiro assinado de 32 bits |
grandes | Número inteiro assinado de 64 bits |
flutuador | Ponto flutuante de precisão única de 32 bits |
em dobro | Número de ponto flutuante de precisão dupla de 64 bits |
bytes | Sequência de bytes não assinados de 8 bits |
corda | Sequência de caracteres |
Tipo complexo
1. O Avro define seis tipos de dados complexos, cada um com atributos exclusivos: A tabela a seguir descreve cada tipo de dado complexo:
2. Cada tipo de dados complexo contém seus próprios atributos, entre os quais Alguns atributos são necessários e outros são opcionais
3. Aqui, o valor padrão do atributo de campo no tipo de Registro precisa ser explicado Quando um atributo de campo nos dados da instância do Esquema do Registro não fornece dados da instância, o valor padrão é fornecido. Para valores específicos, consulte A tabela abaixo. O valor padrão do campo Union é determinado pelo primeiro Esquema na definição Union.
Tipo | Atributos | Explicação |
Registro | classe | |
nome | uma cadeia JSON que fornece o nome do registro (obrigatório). | |
namespace | uma sequência JSON que qualifica o nome (opcional). | |
doc | uma cadeia JSON que fornece documentação para o usuário deste esquema (opcional). | |
apelido | uma matriz JSON de cadeias, fornecendo nomes alternativos para este registro (opcional). | |
Campos | uma matriz JSON, listando os campos (obrigatório). | |
nome | uma sequência JSON. | |
tipo | um esquema / uma sequência de registros definidos. | |
padrão | um valor padrão para o campo quando falta. | |
ordem | ordenação deste campo. | |
Enums | enum | |
nome | uma cadeia JSON que fornece o nome da enumeração (obrigatório). | |
namespace | uma sequência JSON que qualifica o nome. | |
doc | uma cadeia JSON que fornece documentação para o usuário deste esquema (opcional). | |
apelido | uma matriz JSON de cadeias, fornecendo nomes alternativos para esta enumeração (opcional) | |
símbolos | uma matriz JSON, listando símbolos, como sequências JSON (obrigatório). Todos os símbolos em uma enumeração devem ser exclusivos. | |
Matrizes | matriz | |
Itens | o esquema dos itens da matriz. | |
Mapas | mapa | |
valores | o esquema dos valores do mapa. | |
Fixo | fixo | |
nome | uma string nomeando isso fixo (obrigatório). | |
namespace | uma sequência que qualifica o nome. | |
apelido | uma matriz JSON de cadeias, fornecendo nomes alternativos para essa enumeração (opcional). | |
Tamanho | um número inteiro, especificando o número de bytes por valor (obrigatório). | |
Sindicatos | uma matriz JSON |
Ilustrar
Tipo Avro | tipo json | Exemplos |
nulo | nulo | nulo |
boleano | boleano | verdadeiro |
int, longo | inteiro | 1 |
flutuador, duplo | número | 1.1 |
bytes | corda | "\ u00FF" |
corda | corda | "foo" |
registro | objeto | {"a": 1} |
enum | corda | "FOO" |
matriz | matriz | [1] |
mapa | objeto | {"a": 1} |
fixo | corda | "\ u00ff" |
Exemplos de uso
Arquivo POM
<projeto xmlns = "http://maven.apache.org/POM/4.0.0" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi: schemaLocation = "http: / /maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd ">
<modelVersion> 4.0.0 </modelVersion>
<groupId> com.blb < / groupId>
<artifactId> avro </artifactId>
<versão> 0.0.1-SNAPSHOT </version>
<packaging> jar </packaging>
<dependências>
<dependência>
<groupId> org.apache.avro </groupId>
< artifactId> avro </artifactId>
<versão> 1.8.2 </ versão>
</dependency>
<dependency>
<groupId> org.apache.avro </groupId>
<artifactId> avro-tools </artifactId>
<versão> 1.8.2 </version>
</dependency>
<dependência>
<groupId> org.apache.avro </groupId>
<artifactId> avro-maven-plugin </ artifactId >
<version> 1.8.2 </version>
</dependency>
<dependency>
<groupId> org.apache.avro </groupId>
<artifactId> avro-compiler </artifactId>
<version> 1.8.2 </version>
</dependency>
<dependency>
<groupId> org.apache.avro </groupId>
<artifactId> avro-ipc </artifactId>
<versão> 1.8.2 </version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId> org.apache.maven.plugins </ groupId>
<artifactId> maven-compiler-plugin </ artifactId>
<versão> 3.1 </ version>
<configuration>
<! - de um modo geral, destino e destino A fonte é consistente, mas às vezes, para permitir que o programa seja executado em outras versões do jdk (para o jdk de destino da versão baixa, o código-fonte não pode usar a sintaxe que não é suportada no jdk da versão baixa), haverá um destino diferente do código-fonte Situação->
<source> 1.8 </ source> <! - A versão do JDK usada pelo código-fonte->
<target> 1.8 </ target> <! - A versão compilada do arquivo de classe de destino que precisa ser gerada->
< codificação> UTF-8 </ codificação> <! - codificação do conjunto de caracteres->
</ configuração>
</ plugin>
<plugin>
<groupId> org.apache.avro </groupId>
<artifactId> avro-maven-plugin </artifactId>
<version> 1.8.2 </version>
<executions>
<execution>
<phase> generate-sources </phase>
<goals>
<goal> esquema </goal>
</goals>
<configuração>
<sourceDirectory> $ {project.basedir} / src / main / avro / </sourceDirectory>
<outputDirectory> $ {project.basedir} / src / main / java / </outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId> org.apache.maven.plugins </groupId>
<artifactId> maven-compiler-plugin </artifactId>
<configuration>
<source> 1.8 </source>
<target> 1.8 </ target>
</configuration>
</plugin>
</plugins>
</build>
</project>
uma cadeia JSON que fornece documentação para o usuário deste esquema (opcional). |