Hi everyone,
I've found something which I think either wrong or feature.
Say, I have a proto file with definitions:
message Article {
message PrintData {
int32 page = 1;
bool is_published = 2;
string section = 3;
string column = 4;
}
string title = 1;
PrintData print_data = 2;
string kicker = 3;
}
message Image {
string caption = 1;
string author = 2;
int32 width = 3;
}
And then, using Java code I'm filling all the fields in Article, converting it to bytes array and trying to decode it to the Image. Expecting some error, but:
Article article = Article.newBuilder()
.setTitle("TITLE")
.setPrintData(
Article.PrintData.newBuilder()
.setPage(1)
.setIsPublished(true)
.setSection("NEWS")
.setColumn("Review")
)
.setKicker("BOOM")
.build();
byte[] bytes = article.toByteArray();
try {
Image image = Image.parseFrom(bytes);
System.out.println("Caption: " + image.getCaption()); // TITLE
System.out.println("Author: " + image.getAuthor()); // NEWS" Review
System.out.println("Width: " + image.getWidth()); // 0
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
At the same time, same example failing in Go (which is expected):
bad wiretype for field assets.Image.Width: got wiretype 2, want 0.
I wonder if you know answers on these questions:
1) Should go and Java libraries behaviors be the same?
2) Should Java throw exception when Protobuf fields and not compatible?
3) Is it ok that image.author for all strings content from article.print_data?
Code samples (try it yourself):
Additional information:
I've used
znly/protoc docker image to generate Go classes from Protobuf.
$ java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
$ go version
go version go1.7.1 darwin/amd64
Thanks.