elixir-protobuf / protobuf

A pure Elixir implementation of Google Protobuf.
https://hexdocs.pm/protobuf/readme.html
MIT License
809 stars 141 forks source link

Invalid field number 0 when decoding binary data #333

Open VincentRPS opened 1 year ago

VincentRPS commented 1 year ago

I am currently trying to use Protobuf in one of my elixir projects but I keep getting this error:

** (Protobuf.DecodeError) invalid field number 0 when decoding binary data
    (protobuf 0.11.0) lib/protobuf/decoder.ex:48: Protobuf.Decoder.build_message/3
    (protobuf 0.11.0) lib/protobuf/decoder.ex:17: Protobuf.Decoder.decode/2
    (protobuf 0.11.0) lib/protobuf/decoder.ex:231: Protobuf.Decoder.value_for_field/3
    (protobuf 0.11.0) lib/protobuf/decoder.ex:382: Protobuf.Decoder.update_in_message/3
    (protobuf 0.11.0) lib/protobuf/decoder.ex:176: Protobuf.Decoder.handle_value/6
    (protobuf 0.11.0) lib/protobuf/decoder.ex:17: Protobuf.Decoder.decode/2
    (protobuf 0.11.0) lib/protobuf/decoder.ex:231: Protobuf.Decoder.value_for_field/3
    (protobuf 0.11.0) lib/protobuf/decoder.ex:382: Protobuf.Decoder.update_in_message/3
--elixir_out: protoc-gen-elixir: Plugin failed with status code 1.

I've looked everywhere for a solution but seemingly can't find one.

This is my Protobuf code:

syntax = "proto3";

import "google/protobuf/any.proto";

package derailed.grpc;

service Guild {
    rpc publish (Publ) returns (Publr) {};
    rpc get_guild_info (GetGuildInfo) returns (RepliedGuildInfo) {};
}

message Message {
    string event = 1;
    map<string, google.protobuf.Any> data = 2;
}

message Publ {
    string guild_id = 1;
    Message message = 2;
}

message Publr {
    string message = 1;
}

message GetGuildInfo {
    string guild_id = 1;
}

message RepliedGuildInfo {
    int32 presences = 1;
}
whatyouhide commented 1 year ago

Thanks for the report! Can you provide a minimal set of steps to reproduce the error? The Protobuf schema helps, but I'd like to have a small script that reproduces this 🙃

VincentRPS commented 1 year ago

Thanks for the report! Can you provide a minimal set of steps to reproduce the error? The Protobuf schema helps, but I'd like to have a small script that reproduces this 🙃

sorry for the late response, was busy with some things. All I did was run protoc --elixir_out=./lib {the_proto}.proto like in the example. I don't really know what could be causing this.

I recently just reinstalled both Erlang and Elixir and even that didn't do anything. I am on Windows but I really doubt that's is the problem. It seems like the problem is occurring on this line (Protobuf.Decoder:45-48):

if field_number != 0 do
  handle_field(rest, field_number, wire_type, message, props)
else
  raise Protobuf.DecodeError, message: "invalid field number 0 when decoding binary data"
end
whatyouhide commented 4 months ago

Okay the first step here will be to see if we can reproduce this @savhappy 👍