背景

博主最近在研究sofa-jraft的时候,看到jraft使用的protobuf,所以单独拎出来单独理解一下。

Protobuf2使用_protobuf

 

Protobuf语法


 

使用案例

1 添加proto文件



syntax="proto2";

package jraft;

import "enum.proto";

option java_package="com.alipay.sofa.jraft.entity1";
option java_outer_classname = "RaftOutter1";


message EntryMeta {
required int64 term = 1;
required EntryType type = 2;
repeated string peers = 3;
optional int64 data_len = 4;
// Don't change field id of `old_peers' in the consideration of backward
// compatibility
repeated string old_peers = 5;
// Checksum fot this log entry, since 1.2.6, added by boyan@antfin.com
optional int64 checksum = 6;
repeated string learners = 7;
repeated string old_learners = 8;
};

message SnapshotMeta {
required int64 last_included_index = 1;
required int64 last_included_term = 2;
repeated string peers = 3;
repeated string old_peers = 4;
repeated string learners = 5;
repeated string old_learners = 6;
}


2 下载protoc.exe   执行:



protoc ./raft.proto --java_out=../java/


会看到在entity1目录下生成

Protobuf2使用_对象序列化_02

 

3 测试



package com.alipay.sofa.jraft.entity1;

import com.alipay.sofa.jraft.entity.EnumOutter;
import com.google.protobuf.InvalidProtocolBufferException;

import java.util.Arrays;

public class PB2Byte {
public static void main(String[] args) throws InvalidProtocolBufferException {
RaftOutter1.EntryMeta.Builder builder = RaftOutter1.EntryMeta.newBuilder();
// ====================================赋值================================
builder.setType(EnumOutter.EntryType.ENTRY_TYPE_UNKNOWN);
builder.setChecksum(4354734L);
builder.setTerm(1);
// builder.setPeers(0, "1");
builder.addPeers("gdghfhf");
builder.addOldPeers("gdghfhf1");

builder.addLearners("7");
builder.addOldLearners("8");
// ====================================build对象================================
RaftOutter1.EntryMeta entryMeta = builder.build();
// ====================================对象序列化================================
byte[] byteArray = entryMeta.toByteArray();
System.out.println(Arrays.toString(byteArray));

// ====================================反序列化================================
RaftOutter1.EntryMeta newEntryMeta = RaftOutter1.EntryMeta.parseFrom(byteArray);
System.out.println("newEntryMeta:" + newEntryMeta.toString());
}
}


 

4 结果

Protobuf2使用_赋值_03