Open
Description
protobuf.js version: all, up to the current 6.8.0
proto2 preserve unknown fields for future serialization. This is also planned for proto3 in the near future: https://docs.google.com/document/d/1KMRX-G91Aa-Y2FkEaHeeviLRRNblgIahbsk4wA14gRk/edit#heading=h.w8dtggryroj4
I'm working on a merge request that will add unknown fields when decoding as
_unknownFields: { <id|wireType>: }
This should be doable by add read_type_bytes() to Reader and using it instead of skipType. The _unknownField can be later serialized again or discarded by a new method discardUnknownFields().
Tests:
var proto = "message Simple_v1 {\
optional string name = 1;\
optional string value = 3;\
}\
message Simple_v2 {\
optional string name = 1;\
optional int32 flags = 2;\
optional string value = 3;\
}";
var msg = { inner: [{}, {}, {}] };
tape.test("unknown fields", function (test) {
var root = protobuf.parse(proto).root,
Simple_v1 = root.lookup("Simple_v1");
Simple_v2 = root.lookup("Simple_v2");
var s2 = Simple_v2.create({ name: "v2", flags: 2, value: "dummy" });
var s1 = Simple_v1.decode(Simple_v2.encode(s2).finish());
var restored = Simple_v2.decode(Simple_v1.encode(s1).finish());
test.equal(s2.name, restored.name, "assert: even known fields are missing");
test.equal(2, restored.flags, "are preserved by default");
test.end();
});
tape.test("discarded unknown fields", function (test) {
var root = protobuf.parse(proto).root,
Simple_v1 = root.lookup("Simple_v1");
Simple_v2 = root.lookup("Simple_v2");
var s2 = Simple_v2.create({ name: "v2", flags: 2, value: "dummy" });
var s1 = Simple_v1.decode(Simple_v2.encode(s2).finish());
try {
s1.discardUnknownFields();
}
catch (ex) {
test.end("discardUnknownFields() exception: " + ex);
return;
}
var restored = Simple_v2.decode(Simple_v1.encode(s1).finish());
test.equal(undefined, restored.flags, "are removed from the message");
test.end();
});
Does it sound OK?