Я пытаюсь отправлять и получать объекты в protobuf с c до java, у нас есть это сообщение в protobuf, общее для двух приложений.
message MessageFinale {
enum Type {
AUTH = 0;
FILE = 1;
ERRORCODE = 2;
GPS = 3;
};
required Type type = 1;
optional Auth auth = 2 [(nanopb).type = FT_CALLBACK];
optional File file = 3 [(nanopb).type = FT_CALLBACK];
optional ErrorCode errorCode = 4 [(nanopb).type = FT_CALLBACK];
optional GPS gps = 5 [(nanopb).type = FT_CALLBACK];
}
message Auth {
enum Type {
REQ = 0;
RES = 1;
}
required Type type = 1;
message Req {
required uint64 imei = 1;
required uint32 password = 2 [default = 1234];
}
optional Req req = 2 [(nanopb).type = FT_CALLBACK];
message Res {
}
optional Res res = 3 [(nanopb).type = FT_CALLBACK];
}
message File {
enum Type {
LOG = 1;
CMD = 2;
}
required Type type = 1;
optional bytes chunk = 2;
}
message ErrorCode {
required int32 errorId = 1;
enum Status {
ACTIVE = 1;
INACTIVE = 2;
DELETED = 3;
}
required Status status = 2;
}
message GPS {
required int32 lat = 1;
required int32 lng = 2;
}
У меня есть один сервер и клиент в java Я отправлю, я получу все правильно. все сообщения отображаются. Но если мы отправим от c до java. все сообщения в порядке, кроме файла типа. Я не могу десериализовать этот объект.
byte [] buffer = new byte [8092]; // или 4096, или более
int count;
try {
while ((count = in.read(buffer)) > 0) {
bos.write(buffer, 0, count);
}
} catch(Exception e) {
}
System.out.println(bos.size());
System.out.println(bos.toByteArray());
System.out.println(bytesToHex(bos.toByteArray()));
//byte[] filteredByteArray = Arrays.copyOfRange(bos.toByteArray(), 2, bos.toByteArray().length - 2);
//System.out.println(bytesToHex(filteredByteArray));
//Sytem.out.pritnln(bos.toByteArray());
//logger.debug("data serial: {}", buf);
Serializable data = builder.create(bos.toByteArray());
@SuppressWarnings("unchecked")
public boolean deserialize(byte[] binary) {
try {
if (parseFrom_ == null) throw new Exception ("cannot found method name \"parseFrom(byte[] binary)\"");
this.data = (T)parseFrom_.invoke(null, binary);
return true;
} catch (Exception e) {
//logger.error("{}", e);
return false;
}
}
от Java клиента, которого я отправляю так:
**
* Send.
*
* @param data
* the data
* @return true, if successful
* @todo should handle exception properly
*/
protected boolean send(Serializable data) {
try {
if (socket != null && socket.isClosed()) return false;
int size = data.getSerializedSize();
out.write(data.serialize());
out.flush();
return true;
} catch (Exception e) {
//logger.error("{}", e);
return false;
}
}
Я не получаю одинаковые гекса от моего клиента и от c Я могу декодировать только с java. Я не уверен что делать . Любое решение?