protobuf抓包總結
charles工具看到的型別:
double64-bit
float32-bit
int32Varint
int64Varint
uint32Varint
uint64Varint
sint32Varint(值錯誤)
sint64Varint(值錯誤)
fixed3232-bit
fixed6464-bit
sfixed3232-bit
sfixed6464-bit
boolVarint(0,1)
stringLength-delimited
bytes
傳送包
1.required欄位必須賦值,否則會崩潰。1.int32,int64在傳送包層面結果是一樣的。
2.optional欄位在傳送包層面,是允許不存在的。
接送包
1.proto可以部分欄位還原,不影響解析2.int32,int64不影響解析。
3.optional,required不影響解析。
4.可以增加optional欄位,不影響解析。
message ViewLayer{
optional int32 key = 1;
optional string name = 2;
optional int32 focus = 3;
optional string path = 4;
optional int32 pageType = 5;
optional int32 catPageKey = 6;
optional string addTest = 7;
optional string layerName = 127;
}
5.不可以增加required欄位,會崩潰。
message ViewLayer{
optional int32 key = 1;
optional string name = 2;
optional int32 focus = 3;
optional string path = 4;
optional int32 pageType = 5;
optional int32 catPageKey = 6;
required string addTest = 7;
optional string layerName = 127;
}
崩潰提示
com.google.protobuf.InvalidProtocolBufferException: Message missing required fields: module[0].viewLayer[0].addTest, module[1].viewLayer[0].addTest。。。
還原proto的經驗:
public final class Proto$Transfer$Entity extends GeneratedMessageLite implements MCSProto$Transfer$AppInfoEntityOrBuilder {
public static final int APPPKGNAME_FIELD_NUMBER = 1;
public static final int APPVERSIONCODE_FIELD_NUMBER = 2;
public static final int APPVERSIONNAME_FIELD_NUMBER = 3;
public static final int HASACTIVATED_FIELD_NUMBER = 5;
public static final int ISHOSTAPP_FIELD_NUMBER = 6;
public static final int SDKVERSION_FIELD_NUMBER = 4;
private Object appPkgName_;
private int appVersionCode_;
private Object appVersionName_;
private int bitField0_;
private static final MCSProto$Transfer$AppInfoEntity defaultInstance;
private boolean hasActivated_;
private boolean isHostApp_;
private byte memoizedIsInitialized;
private int memoizedSerializedSize;
private int sdkVersion_;
private static final long serialVersionUID;
關鍵字:GeneratedMessageLite
類是Proto$Transfer$Entity,而不是Proto$Transfer$Entity$Builder
Object == string
boolean == bool
int == int32
long == int64