示例#1
0
        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);
        }
示例#2
0
 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);
 }
示例#3
0
 /// <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);
     }
 }