Método de armazenamento Android
SharedPrefence, armazena dados de configuração simples e outros
SQLite, armazena
arquivos de dados relacionais complexos , geralmente armazena arquivos de log, cache de arquivo local, protobuf, 7z
ContentProvider, acesso a dados de processo cruzado, geralmente usado em conjunto com SQLite e fornece dados para outros processos de aplicativos usar.
Armazenamento de rede, o armazenamento de rede envolve serialização / desserialização (protobuf, xml, json)
SharedPrefence
Comprometa e aplique de SharedPrefence
- apply não tem valor de retorno e commit retorna booleano para indicar se a modificação foi enviada com sucesso;
- Commit é enviar de forma síncrona o conteúdo para o disco rígido, e aplicar primeiro envia imediatamente as alterações para a memória e, em seguida, abre um thread assíncrono para enviar para o disco rígido e, se o envio falhar, você não receberá nenhuma notificação.
- Todo envio de confirmação é um processo síncrono e a eficiência será mais lenta do que aplicar o envio assíncrono. Se você não se preocupa com o sucesso do resultado do envio, o método de aplicação é preferível.
- Aplicar é gravar no disco usando threads assíncronos e confirmar é gravar no disco de forma síncrona. Portanto, quando usamos o commit no thread principal, precisamos considerar se haverá problemas de ANR. (Não é adequado para grande armazenamento de dados)
Problemas de multi-processo -> mmkv
SQLite
SQLiteStatement
usa transações,
índices,
threads assíncronos e grava bancos de dados para gerenciamento unificado
A Internet
- Serialização
- Desserialização
Compressão 7z xml
json
protobuf independente de plataforma
(trabalho)
protobuf
Já existe xml / json, por que usar protobuf
Comparado com xml, json, vantagens protobuf:
- Conciso: XML requer muito código de análise, enquanto protobuf gera código automaticamente
- Tamanho pequeno: o tamanho da mensagem é apenas 1/10-1 / 3 de xml
- Velocidade rápida: a velocidade de análise é 20-100 vezes mais rápida do que xml
- Use o sistema de compilação Protobuf: você pode gerar códigos de acesso a dados que são mais fáceis de usar na programação
- Para obter melhor compatibilidade, um princípio do design de Buffers de protocolo é ser capaz de oferecer suporte à compatibilidade ascendente ou descendente.
Desvantagens:
1. O formato binário leva a uma legibilidade ruim.
Para melhorar o desempenho, protobuf usa o formato binário para codificação. Isso leva diretamente a uma legibilidade ruim. Isso afeta diretamente a eficiência de desenvolvimento e teste. É claro que, em circunstâncias normais, o protobuf é muito confiável e não causará maiores problemas.
2. Falta de autodescrição
De modo geral, XML é autodescritivo, enquanto o formato protobuf não. Fornece um formato binário do conteúdo do protocolo, não funcionará se você não corresponder à estrutura que escreveu.
Use protobuf no projeto
Para usar protobuf na linha de comando,
se quiser usar comandos para compilar arquivos protobuf (o sufixo do arquivo protobuf é .proto) em arquivos java, você precisa instalar a ferramenta protobuf e usar o comando protoc para compilar.
Usando protobuf no projeto Android Studio
1) Primeiro, precisamos adicionar o plug-in da ferramenta protobuf ao arquivo global buid.gradle:
classpath 'com.google.protobuf: protobuf-gradle-plugin: 0.8.10'
2) Em seguida, no arquivo app / buid.gradle:
①Adicione este plugin
apply plugin: 'com.google.protobuf'
②Adicionar dependência
implementation 'com.google.protobuf:protobuf-java:3.7.1'
③Adicionar configuração de protobuf
protobuf {
//配置protoc编译器
protoc {
artifact = 'com.google.protobuf:protoc:3.7.1'
}
//这里配置生成目录,编译后会在build的目录下生成对应的java文件
generateProtoTasks {
all().each {
task ->
task.builtins {
remove java
}
task.builtins {
java {
}
}
}
}
}
④Adicione o diretório do arquivo protobuf (no android {})
sourceSets {
main {
proto {
srcDir 'src/main/java/com/protobufdir'
}
}
}
3) Crie um novo arquivo protobufbean.proto no diretório src / main / java / com / protobufdir e adicione o seguinte código:
syntax = "proto3";
package com.example.protobufdemo;//包名
option java_package = "com.example.protobuf02";
option java_outer_classname = "Person";
option csharp_namespace = "android";
message _Person{
string name = 1;
int32 id = 2;
string email = 3;
enum _PhoneType{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message _PhoneNumber{
string number =1;
_PhoneType type = 2;
}
repeated _PhoneNumber phone = 4;//数组
}
4) Reconstrua o projeto.Quando o AS construir o projeto, o arquivo .proto será gerado em um arquivo java.
Você pode encontrar esses arquivos java gerados no diretório \ app \ build \ generated \ source \ proto \ debug \ java \.
Esses arquivos java gerados encapsulam algumas APIs de serialização e desserialização, que podem estar diretamente no projeto Ligue.
Especificação de linguagem
Definição de mensagem
- Determine o nome da mensagem e dê a ela um nome significativo.
- Especifique o tipo de campo
- Defina o número do campo. Em Protocol Buffers, o número do campo é muito importante. O nome do campo é apenas para referência e geração de código. Deve-se observar que o intervalo de números do campo, dos quais 19.000 ~ 19999 são reservados por Buffers de protocolo.
Restrições de campo
- obrigatório especifica que o campo deve receber um valor e não deve estar vazio (essa restrição foi removida na v3);
- O campo opcional especificado é um campo opcional e pode estar vazio. Para campos opcionais, você também pode usar [padrão] para especificar o valor padrão. Se não for especificado, o valor padrão do tipo de campo será usado;
- Use repetido para especificar o campo como uma coleção
Tipo de campo
- Vários tipos de mensagem podem ser definidos em um arquivo proto ao mesmo tempo. Ao gerar o código, dependendo da linguagem de destino do código gerado, o método de processamento é diferente. Por exemplo, Java irá gerar um arquivo .java para cada tipo de mensagem.
- Você pode especificar o tipo do campo como outros tipos de mensagem
- Use a palavra-chave import para importar outros arquivos proto
- O tipo de mensagem no arquivo proto também pode ser aninhado
- No arquivo proto, você pode usar a palavra-chave extensions para reservar uma parte dos números de campo para uso posterior ao estender a terceiros
- A palavra-chave oneof especifica um conjunto de campos, pelo menos um campo deve receber um valor
Muitos tipos escalares são fornecidos em Buffers de protocolo para usarmos ao definir os tipos de campo:
Protocolo de codificação
Codificação de comprimento variável Base-128
- A chamada codificação de comprimento variável é o oposto da codificação de comprimento fixo. A codificação de comprimento fixo é representada por um número fixo de bytes. Por exemplo, os números de tipo int32 são fixos usando 4 bytes, enquanto a codificação de comprimento variável requer vários bytes para usar vários bytes. Por exemplo, para o número 1 do tipo int32, apenas 1 byte é suficiente. Existem dois princípios de codificação de comprimento variável Base-128
- Cada byte usa os 7 bits inferiores para representar o número, exceto para o último byte, o bit mais alto dos outros bytes é definido como 1.
- Usar ordem de bytes Little-Endian
- tag-length-valuetag-length-value
Processamento de codificação negativa
- Adote Codificação ZigZag
(n <<1)^(n>>31)或者(n<<1)^(n>>63)
Big-endian sequência de
escrever de alta-primeira ordem, em seguida, baixa sequência endian Escrever baixo
-order
em primeiro lugar, seguida de alta ordem
Protocolo de serialização de buffers de protocolo e aplicação
[Protobuf] Regras de codificação e decodificação de Protobuf em detalhes