最近在研究android的udp开发,前后端用protobuf传输协议。由于序列化后的二进制流一下子不能解析成对应的类。经过一番思考,可以用两次序列化的方式实现,将要发送的序列化字节流放入到另外一个发送类里面,这样的话只需要发送总的序列化类即可。
总的序列化类:
option java_package = "com.example.minedemo";
option java_outer_classname = "TypeInfo";
message typeinfo{
required int32 id = 1;
required bytes bytesData = 2;
}
比如要发送的登陆类:
option java_package = "com.example.minedemo";
option java_outer_classname = "LoginMsg";
message msginfo{
required int32 id = 1;
required int32 single = 2;
required string name = 3;
required string pwd = 4;
}
前后端只发送Typeinfo序列化类即可。
试验下:
Msg.msginfo.Builder msg = Msg.msginfo.newBuilder().setId(1).setSingle(1).setName("xxb").setPwd("123456");
Msg.msginfo info = msg.build();
byte[] bytes = info.toByteArray();
try
{
TypeInfo.typeinfo.Builder typeinfo = TypeInfo.typeinfo.newBuilder().setId(11).setBytesData(ByteString.copyFrom(bytes));
TypeInfo.typeinfo typeinfo1 = typeinfo.build();
byte[] typebytes = typeinfo1.toByteArray();
TypeInfo.typeinfo responseType = TypeInfo.typeinfo.parseFrom(typebytes);
Msg.msginfo test = Msg.msginfo.parseFrom(responseType.getBytesData().toByteArray()) ;
String showStr =test.getId()+">>"+test.getName();
new AlertDialog.Builder(this).setTitle(showStr).show();
Toast.makeText(this,showStr,Toast.LENGTH_LONG).show();
}
catch (Exception e){}