public void LegacyGeneratedCodeThrowsWithReadOnlySequence() { var message = new ParseContextEnabledMessageB { A = new LegacyGeneratedCodeMessageA { Bb = new ParseContextEnabledMessageB { OptionalInt32 = 12345 } }, OptionalInt32 = 6789 }; var data = message.ToByteArray(); // if parsing started using ReadOnlySequence and we don't have a CodedInputStream // instance at hand, we cannot fall back to the legacy MergeFrom(CodedInputStream) // method and parsing will fail. As a consequence, one can only use parsing // from ReadOnlySequence if all the messages in the parsing tree have their generated // code up to date. var exception = Assert.Throws <InvalidProtocolBufferException>(() => { ParseContext.Initialize(new ReadOnlySequence <byte>(data), out ParseContext parseCtx); var parsed = new ParseContextEnabledMessageB(); ParsingPrimitivesMessages.ReadRawMessage(ref parseCtx, parsed); }); Assert.AreEqual($"Message {typeof(LegacyGeneratedCodeMessageA).Name} doesn't provide the generated method that enables ParseContext-based parsing. You might need to regenerate the generated protobuf code.", exception.Message); }
internal static void MergeFrom(this IMessage message, ReadOnlySpan <byte> data, bool discardUnknownFields, ExtensionRegistry registry) { ParseContext.Initialize(data, out ParseContext ctx); ctx.DiscardUnknownFields = discardUnknownFields; ctx.ExtensionRegistry = registry; ParsingPrimitivesMessages.ReadRawMessage(ref ctx, message); ParsingPrimitivesMessages.CheckReadEndOfStreamTag(ref ctx.state); }
/// <summary> /// Reads a top-level message or a nested message after the limits for this message have been pushed. /// (parser will proceed until the end of the current limit) /// NOTE: this method needs to be public because it's invoked by the generated code - e.g. msg.MergeFrom(CodedInputStream input) method /// </summary> public void ReadRawMessage(IMessage message) { ParseContext.Initialize(this, out ParseContext ctx); try { ParsingPrimitivesMessages.ReadRawMessage(ref ctx, message); } finally { ctx.CopyStateTo(this); } }