下面列出了怎么用com.google.protobuf.Descriptors.FileDescriptor.Syntax的API类实例代码及写法,或者点击链接到github查看源代码。
/** Get the syntax of the .proto file. */
public Syntax getSyntax() {
if (Syntax.PROTO3.name.equals(proto.getSyntax())) {
return Syntax.PROTO3;
}
return Syntax.PROTO2;
}
/** For internal use only. */
public boolean needsUtf8Check() {
if (type != Type.STRING) {
return false;
}
if (getContainingType().getOptions().getMapEntry()) {
// Always enforce strict UTF-8 checking for map fields.
return true;
}
if (getFile().getSyntax() == Syntax.PROTO3) {
return true;
}
return getFile().getOptions().getJavaStringCheckUtf8();
}
/** Does this field have the {@code [packed = true]} option or is this field
* packable in proto3 and not explicitly setted to unpacked?
*/
@Override
public boolean isPacked() {
if (!isPackable()) {
return false;
}
if (getFile().getSyntax() == FileDescriptor.Syntax.PROTO2) {
return getOptions().getPacked();
} else {
return !getOptions().hasPacked() || getOptions().getPacked();
}
}
/**
* Recursively walks the given {@link Message} class and verifies that every field or message
* linked in uses the Protocol Buffers proto2 syntax.
*/
static void checkProto2Syntax(Class<? extends Message> clazz, ExtensionRegistry registry) {
for (GenericDescriptor d : getRecursiveDescriptorsForClass(clazz, registry)) {
Syntax s = d.getFile().getSyntax();
checkArgument(
s == Syntax.PROTO2,
"Message %s or one of its dependencies does not use proto2 syntax: %s in file %s",
clazz.getName(),
d.getFullName(),
d.getFile().getName());
}
}
Syntax(String name) {
this.name = name;
}
boolean supportsUnknownEnumValue() {
return getSyntax() == Syntax.PROTO3;
}
@Override
public void serialize(
MessageOrBuilder message,
JsonGenerator generator,
SerializerProvider serializerProvider
) throws IOException {
generator.writeStartObject();
boolean proto3 = message.getDescriptorForType().getFile().getSyntax() == Syntax.PROTO3;
Include include = serializerProvider.getConfig().getDefaultPropertyInclusion().getValueInclusion();
boolean writeDefaultValues = proto3 && include != Include.NON_DEFAULT;
boolean writeEmptyCollections = include != Include.NON_DEFAULT && include != Include.NON_EMPTY;
PropertyNamingStrategyBase namingStrategy =
new PropertyNamingStrategyWrapper(serializerProvider.getConfig().getPropertyNamingStrategy());
Descriptor descriptor = message.getDescriptorForType();
List<FieldDescriptor> fields = new ArrayList<>(descriptor.getFields());
if (message instanceof ExtendableMessageOrBuilder<?>) {
for (ExtensionInfo extensionInfo : config.extensionRegistry().getExtensionsByDescriptor(descriptor)) {
fields.add(extensionInfo.descriptor);
}
}
for (FieldDescriptor field : fields) {
if (field.isRepeated()) {
List<?> valueList = (List<?>) message.getField(field);
if (!valueList.isEmpty() || writeEmptyCollections) {
if (field.isMapField()) {
generator.writeFieldName(namingStrategy.translate(field.getName()));
writeMap(field, valueList, generator, serializerProvider);
} else if (valueList.size() == 1 && writeSingleElementArraysUnwrapped(serializerProvider)) {
generator.writeFieldName(namingStrategy.translate(field.getName()));
writeValue(field, valueList.get(0), generator, serializerProvider);
} else {
generator.writeArrayFieldStart(namingStrategy.translate(field.getName()));
for (Object subValue : valueList) {
writeValue(field, subValue, generator, serializerProvider);
}
generator.writeEndArray();
}
}
} else if (message.hasField(field) || (writeDefaultValues && !supportsFieldPresence(field) && field.getContainingOneof() == null)) {
generator.writeFieldName(namingStrategy.translate(field.getName()));
writeValue(field, message.getField(field), generator, serializerProvider);
} else if (include == Include.ALWAYS && field.getContainingOneof() == null) {
generator.writeFieldName(namingStrategy.translate(field.getName()));
generator.writeNull();
}
}
generator.writeEndObject();
}