Como usar o protobuf


typora-copy-images-to: assets
typora-root-url: assets

Buffers de protocolo

Introdução aos buffers de protocolo

  • Protocal Buffers (protobuf para abreviar) é uma tecnologia do Google usada para serialização e desserialização de dados estruturados e costuma ser usada em sistemas RPC e sistemas de armazenamento contínuo de dados.
  • É semelhante à geração e análise de XML, mas protobuf é mais eficiente que XML, mas protobuf gera bytecode , que é menos legível que XML, semelhante a json, Java's Serializable, etc.
  • É muito adequado para armazenamento de dados ou formato de troca de dados RPC. Ele pode ser usado para formatos de dados estruturados serializados extensíveis e independentes de linguagem em protocolos de comunicação, armazenamento de dados e outros campos.
  • Referência: https://zhuanlan.zhihu.com/p/53339153

Ideia de instalação do plugin protobuf

Instale o plug-in protobuf Support e reinicie

  • Encontre o protobuf-jetbrains-plugin-0.13.0.zip no pacote de dados e instale o plug-in no IDEA

Insira a descrição da imagem aqui

Use ProtoBuf para serializar dados

Configurar dependências e plug-ins do Maven


    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.4.0</version>
        </dependency>
    </dependencies>

    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.2</version>
            </extension>
        </extensions>
        <plugins>
            <!-- Protobuf插件 src/main/java/proto -->
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.0</version>
                <configuration>
                    <protoSourceRoot>${project.basedir}/src/main/java/proto</protoSourceRoot>
                    <protocArtifact>
                        com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}
                    </protocArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Gravar arquivo proto

  • A gramática do protobuf3 refere-se à "gramática do protobuf3" no folheto

  • Na pasta principal, crie o diretório proto e grave o arquivo proto

syntax = "proto3";
option java_package = "com.wangjie.protobuf";
option java_outer_classname = "Msg";

message User {
    int32 id = 1;
    string name = 2;
    string sex = 3;
}
message Stats{
    int32 hp =1;
    int32 mp = 2;
    int32 exp =3;
    int32 atk =4;
    int32 def =5;
}

Nota: o nome da classe não pode ser igual ao nome da mensagem

protobuf e tabela de comparação de tipo java

.proto Type Tipo Java Observações
em dobro em dobro
flutuador flutuador
int32 int Use codificação de comprimento variável. A codificação negativa é ineficiente - se seu campo pode ter valores negativos, use sint32 em vez disso.
int64 longo Use codificação de comprimento variável. A codificação negativa é ineficiente - se seu campo pode ter valores negativos, use sint64 em vez disso.
uint32 int Use codificação de comprimento variável.
uint64 longo Use codificação de comprimento variável.
Sint32 int Use codificação de comprimento variável. Valor int assinado. Comparados com o int32 normal, eles codificam números negativos com mais eficiência.
Sint64 longo Use codificação de comprimento variável. Valor int assinado. Em comparação com o int64 regular, eles codificam números negativos com mais eficiência.
corrigido 32 int São sempre quatro bytes. Se o valor geralmente for maior do que 2 ^ 28, é mais eficiente do que uint32.
fixo 64 longo São sempre oito bytes. Se o valor normalmente for maior que 2 ^ 56, é mais eficiente que uint64.
sfixed32 int São sempre quatro bytes.
sfixed64 longo São sempre oito bytes.
bool boleano
fragmento Fragmento A string deve sempre conter codificação UTF-8 ou texto ASCII de 7 bits.
bytes ByteString Pode conter qualquer sequência de bytes.

Execute protobuf: comando compilar compilação

  • Compile o arquivo proto em código java

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Escreva o código usando a serialização e desserialização ProtoBuf

package com.wangjie.protobuf;

import com.google.protobuf.InvalidProtocolBufferException;

public class ProtoBufMsg {
    
    
    public static void main(String[] args) {
    
    
        Msg.User.Builder builder = Msg.User.newBuilder();
        builder.setId(1);
        builder.setName("saber");
        builder.setSex("female");

        byte[] bytes = builder.build().toByteArray();
        System.out.println("--protobuf---");
        for (byte b : bytes) {
    
    
            System.out.print(b);
        }
        System.out.println();
        System.out.println("---");

        try {
    
    
            Msg.User user = Msg.User.parseFrom(bytes);
            System.out.println(user);
        } catch (InvalidProtocolBufferException e) {
    
    
            e.printStackTrace();
        }

        Msg.Stats.Builder statsBuild = Msg.Stats.newBuilder();
        statsBuild.setHp(10);
        statsBuild.setMp(10);
        statsBuild.setExp(10);
        statsBuild.setDef(10);
        statsBuild.setAtk(10);

        byte[] bytes1 = statsBuild.build().toByteArray();
        System.out.println("--protobuf---");
        for (byte b : bytes1) {
    
    
            System.out.print(b);
        }
        System.out.println();
        System.out.println("---");

        Msg.Stats stats = null;
        try {
    
    
            stats = Msg.Stats.parseFrom(bytes1);
        } catch (InvalidProtocolBufferException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(stats);
    }

}

Acho que você gosta

Origin blog.csdn.net/qq_36382679/article/details/115000374
Recomendado
Clasificación