|
@@ -203,10 +203,14 @@ namespace Google.Protobuf
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- // TODO: Is this what we want to do? If not, we'll need to skip the value,
|
|
|
- // which may be an object or array. (We might want to put code in the tokenizer
|
|
|
- // to do that.)
|
|
|
- throw new InvalidProtocolBufferException("Unknown field: " + name);
|
|
|
+ if (settings.IgnoreUnknownFields)
|
|
|
+ {
|
|
|
+ tokenizer.SkipValue();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ throw new InvalidProtocolBufferException("Unknown field: " + name);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -996,6 +1000,19 @@ namespace Google.Protobuf
|
|
|
/// </summary>
|
|
|
public TypeRegistry TypeRegistry { get; }
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Whether the parser should ignore unknown fields (<c>true</c>) or throw an exception when
|
|
|
+ /// they are encountered (<c>false</c>).
|
|
|
+ /// </summary>
|
|
|
+ public bool IgnoreUnknownFields { get; }
|
|
|
+
|
|
|
+ private Settings(int recursionLimit, TypeRegistry typeRegistry, bool ignoreUnknownFields)
|
|
|
+ {
|
|
|
+ RecursionLimit = recursionLimit;
|
|
|
+ TypeRegistry = ProtoPreconditions.CheckNotNull(typeRegistry, nameof(typeRegistry));
|
|
|
+ IgnoreUnknownFields = ignoreUnknownFields;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Creates a new <see cref="Settings"/> object with the specified recursion limit.
|
|
|
/// </summary>
|
|
@@ -1009,11 +1026,17 @@ namespace Google.Protobuf
|
|
|
/// </summary>
|
|
|
/// <param name="recursionLimit">The maximum depth of messages to parse</param>
|
|
|
/// <param name="typeRegistry">The type registry used to parse <see cref="Any"/> messages</param>
|
|
|
- public Settings(int recursionLimit, TypeRegistry typeRegistry)
|
|
|
+ public Settings(int recursionLimit, TypeRegistry typeRegistry) : this(recursionLimit, typeRegistry, false)
|
|
|
{
|
|
|
- RecursionLimit = recursionLimit;
|
|
|
- TypeRegistry = ProtoPreconditions.CheckNotNull(typeRegistry, nameof(typeRegistry));
|
|
|
}
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Creates a new <see cref="Settings"/> object set to either ignore unknown fields, or throw an exception
|
|
|
+ /// when unknown fields are encountered.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="ignoreUnknownFields"><c>true</c> if unknown fields should be ignored when parsing; <c>false</c> to throw an exception.</param>
|
|
|
+ public Settings WithIgnoreUnknownFields(bool ignoreUnknownFields) =>
|
|
|
+ new Settings(RecursionLimit, TypeRegistry, ignoreUnknownFields);
|
|
|
}
|
|
|
}
|
|
|
}
|