Невозможно десериализовать объект, поступающий из c protobuf - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь отправлять и получать объекты в 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. Я не уверен что делать . Любое решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...