Java源码示例:com.google.protobuf.NullValue
示例1
@Override
public void doMerge(JsonParser parser, int currentDepth, Message.Builder messageBuilder)
throws IOException {
Value.Builder builder = (Value.Builder) messageBuilder;
JsonToken token = parser.currentToken();
if (token.isBoolean()) {
builder.setBoolValue(ParseSupport.parseBool(parser));
} else if (token.isNumeric()) {
builder.setNumberValue(ParseSupport.parseDouble(parser));
} else if (token == JsonToken.VALUE_NULL) {
builder.setNullValue(NullValue.NULL_VALUE);
} else if (token.isScalarValue()) {
builder.setStringValue(ParseSupport.parseString(parser));
} else if (token == JsonToken.START_OBJECT) {
Struct.Builder structBuilder = builder.getStructValueBuilder();
StructMarshaller.INSTANCE.mergeValue(parser, currentDepth + 1, structBuilder);
} else if (token == JsonToken.START_ARRAY) {
ListValue.Builder listValueBuilder = builder.getListValueBuilder();
ListValueMarshaller.INSTANCE.mergeValue(parser, currentDepth + 1, listValueBuilder);
} else {
throw new IllegalStateException("Unexpected json data: " + parser.getText());
}
}
示例2
@Test
public void anyInMaps() throws Exception {
TestAny.Builder testAny = TestAny.newBuilder();
testAny.putAnyMap("int32_wrapper", Any.pack(Int32Value.newBuilder().setValue(123).build()));
testAny.putAnyMap("int64_wrapper", Any.pack(Int64Value.newBuilder().setValue(456).build()));
testAny.putAnyMap("timestamp", Any.pack(Timestamps.parse("1969-12-31T23:59:59Z")));
testAny.putAnyMap("duration", Any.pack(Durations.parse("12345.1s")));
testAny.putAnyMap("field_mask", Any.pack(FieldMaskUtil.fromString("foo.bar,baz")));
Value numberValue = Value.newBuilder().setNumberValue(1.125).build();
Struct.Builder struct = Struct.newBuilder();
struct.putFields("number", numberValue);
testAny.putAnyMap("struct", Any.pack(struct.build()));
Value nullValue = Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build();
testAny.putAnyMap(
"list_value",
Any.pack(ListValue.newBuilder().addValues(numberValue).addValues(nullValue).build()));
testAny.putAnyMap("number_value", Any.pack(numberValue));
testAny.putAnyMap("any_value_number", Any.pack(Any.pack(numberValue)));
testAny.putAnyMap("any_value_default", Any.pack(Any.getDefaultInstance()));
testAny.putAnyMap("default", Any.getDefaultInstance());
assertMatchesUpstream(testAny.build(), TestAllTypes.getDefaultInstance());
}
示例3
@Test
public void includingDefaultValueFields() throws Exception {
TestAllTypes message = TestAllTypes.getDefaultInstance();
assertMatchesUpstream(message);
assertMatchesUpstream(message, true, false, false, false, false);
TestMap mapMessage = TestMap.getDefaultInstance();
assertMatchesUpstream(mapMessage);
assertMatchesUpstream(mapMessage, true, false, false, false, false);
TestOneof oneofMessage = TestOneof.getDefaultInstance();
assertMatchesUpstream(oneofMessage);
assertMatchesUpstream(oneofMessage, true, false, false, false, false);
oneofMessage = TestOneof.newBuilder().setOneofInt32(42).build();
assertMatchesUpstream(oneofMessage);
assertMatchesUpstream(oneofMessage, true, false, false, false, false);
oneofMessage = TestOneof.newBuilder().setOneofNullValue(NullValue.NULL_VALUE).build();
assertMatchesUpstream(oneofMessage);
assertMatchesUpstream(oneofMessage, true, false, false, false, false);
}
示例4
@Test
public void itReadsAllStructValueTypes() throws IOException {
String json = "{\"struct\":{\"null\":null,\"number\":1.5,\"string\":\"test\",\"boolean\":true,\"struct\":{\"key\":\"nested\"},\"list\":[\"nested\"]}}";
HasStruct message = camelCase().readValue(json, HasStruct.class);
assertThat(message.hasStruct()).isTrue();
Map<String, Value> map = message.getStruct().getFieldsMap();
Value nested = Value.newBuilder().setStringValue("nested").build();
Struct nestedStruct = Struct.newBuilder().putFields("key", nested).build();
ListValue list = ListValue.newBuilder().addValues(nested).build();
assertThat(map.size()).isEqualTo(6);
assertThat(map.get("null")).isEqualTo(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build());
assertThat(map.get("number")).isEqualTo(Value.newBuilder().setNumberValue(1.5).build());
assertThat(map.get("string")).isEqualTo(Value.newBuilder().setStringValue("test").build());
assertThat(map.get("boolean")).isEqualTo(Value.newBuilder().setBoolValue(true).build());
assertThat(map.get("struct")).isEqualTo(Value.newBuilder().setStructValue(nestedStruct).build());
assertThat(map.get("list")).isEqualTo(Value.newBuilder().setListValue(list).build());
}
示例5
@Test
public void itWritesMixedListValue() throws IOException {
Value nestedValue = Value.newBuilder().setStringValue("nested").build();
Struct struct = Struct.newBuilder().putFields("key", nestedValue).build();
ListValue nestedList = ListValue.newBuilder().addValues(nestedValue).build();
ListValue list = ListValue
.newBuilder()
.addValues(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build())
.addValues(Value.newBuilder().setNumberValue(1.5d).build())
.addValues(Value.newBuilder().setStringValue("test").build())
.addValues(Value.newBuilder().setBoolValue(true).build())
.addValues(Value.newBuilder().setStructValue(struct).build())
.addValues(Value.newBuilder().setListValue(nestedList).build())
.build();
HasValue message = HasValue
.newBuilder()
.setValue(Value.newBuilder().setListValue(list).build())
.build();
String json = camelCase().writeValueAsString(message);
assertThat(json).isEqualTo("{\"value\":[null,1.5,\"test\",true,{\"key\":\"nested\"},[\"nested\"]]}");
}
示例6
@Test
public void itReadsMixedStruct() throws IOException {
String json = "{\"value\":{\"null\":null,\"number\":1.5,\"string\":\"test\",\"boolean\":true,\"struct\":{\"key\":\"nested\"},\"list\":[\"nested\"]}}";
HasValue message = camelCase().readValue(json, HasValue.class);
assertThat(message.hasValue()).isTrue();
Value value = message.getValue();
switch (value.getKindCase()) {
case STRUCT_VALUE:
Map<String, Value> map = value.getStructValue().getFieldsMap();
Value nested = Value.newBuilder().setStringValue("nested").build();
Struct nestedStruct = Struct.newBuilder().putFields("key", nested).build();
ListValue list = ListValue.newBuilder().addValues(nested).build();
assertThat(map.size()).isEqualTo(6);
assertThat(map.get("null")).isEqualTo(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build());
assertThat(map.get("number")).isEqualTo(Value.newBuilder().setNumberValue(1.5).build());
assertThat(map.get("string")).isEqualTo(Value.newBuilder().setStringValue("test").build());
assertThat(map.get("boolean")).isEqualTo(Value.newBuilder().setBoolValue(true).build());
assertThat(map.get("struct")).isEqualTo(Value.newBuilder().setStructValue(nestedStruct).build());
assertThat(map.get("list")).isEqualTo(Value.newBuilder().setListValue(list).build());
break;
default:
fail("Unexpected value kind: " + value.getKindCase());
}
}
示例7
@Test
public void itReadsMixedListValue() throws IOException {
String json = "{\"value\":[null,1.5,\"test\",true,{\"key\":\"nested\"},[\"nested\"]]}";
HasValue message = camelCase().readValue(json, HasValue.class);
assertThat(message.hasValue()).isTrue();
Value value = message.getValue();
switch (value.getKindCase()) {
case LIST_VALUE:
ListValue list = value.getListValue();
Value nested = Value.newBuilder().setStringValue("nested").build();
Struct struct = Struct.newBuilder().putFields("key", nested).build();
ListValue nestedList = ListValue.newBuilder().addValues(nested).build();
assertThat(list.getValuesCount()).isEqualTo(6);
assertThat(list.getValues(0)).isEqualTo(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build());
assertThat(list.getValues(1)).isEqualTo(Value.newBuilder().setNumberValue(1.5).build());
assertThat(list.getValues(2)).isEqualTo(Value.newBuilder().setStringValue("test").build());
assertThat(list.getValues(3)).isEqualTo(Value.newBuilder().setBoolValue(true).build());
assertThat(list.getValues(4)).isEqualTo(Value.newBuilder().setStructValue(struct).build());
assertThat(list.getValues(5)).isEqualTo(Value.newBuilder().setListValue(nestedList).build());
break;
default:
fail("Unexpected value kind: " + value.getKindCase());
}
}
示例8
@Test
public void itReadsMixedTypeValues() throws IOException {
String json = "{\"listValue\":[null,1.5,\"test\",true,{\"key\":\"value\"},[\"nested\"]]}";
HasListValue message = camelCase().readValue(json, HasListValue.class);
Struct struct = Struct.newBuilder().putFields("key", Value.newBuilder().setStringValue("value").build()).build();
ListValue list = ListValue.newBuilder().addValues(Value.newBuilder().setStringValue("nested")).build();
ListValue expected = ListValue
.newBuilder()
.addValues(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build())
.addValues(Value.newBuilder().setNumberValue(1.5d).build())
.addValues(Value.newBuilder().setStringValue("test").build())
.addValues(Value.newBuilder().setBoolValue(true).build())
.addValues(Value.newBuilder().setStructValue(struct).build())
.addValues(Value.newBuilder().setListValue(list).build())
.build();
assertThat(message.hasListValue()).isTrue();
assertThat(message.getListValue()).isEqualTo(expected);
}
示例9
private <T> Value parseList(List<T> list, ParseContext context) {
ArrayValue.Builder arrayBuilder = ArrayValue.newBuilder();
int entryIndex = 0;
for (T entry : list) {
@Nullable Value parsedEntry = parseData(entry, context.childContext(entryIndex));
if (parsedEntry == null) {
// Just include nulls in the array for fields being replaced with a sentinel.
parsedEntry = Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build();
}
arrayBuilder.addValues(parsedEntry);
entryIndex++;
}
return Value.newBuilder().setArrayValue(arrayBuilder).build();
}
示例10
/**
* Tests that BigQueryConverters.columnToValue() returns a null {@link Value} when the BigQuery
* column is null.
*/
@Test
public void testColumnToValueNull() {
TableFieldSchema column = new TableFieldSchema().setName(nullField).setType("STRING");
Record record = generateSingleFieldAvroRecord(nullField, "null", nullFieldDesc, null);
Value value = BigQueryConverters.columnToValue(column, record.get(nullField));
assertEquals(NullValue.NULL_VALUE, value.getNullValue());
}
示例11
/**
* Determines whether we skip processing of the field if it is null. We usually skip null values
* in the JSON to treat them as default, but must actually process the null for {@link Value} and
* {@link NullValue} because it means their value must be set.
*/
private static boolean mustSkipNull(FieldDescriptor field) {
if (field.isRepeated()) {
return true;
}
if (field.getJavaType() == JavaType.MESSAGE
&& field.getMessageType() == Value.getDescriptor()) {
return false;
}
if (field.getJavaType() == JavaType.ENUM && field.getEnumType() == NullValue.getDescriptor()) {
return false;
}
return true;
}
示例12
@Test
public void nullInOneOf() throws Exception {
TestOneof.Builder builder = TestOneof.newBuilder();
mergeFromJson("{\n" + " \"oneofNullValue\": null \n" + "}", builder);
TestOneof message = builder.build();
assertEquals(TestOneof.OneofFieldCase.ONEOF_NULL_VALUE, message.getOneofFieldCase());
assertEquals(NullValue.NULL_VALUE, message.getOneofNullValue());
}
示例13
/**
* Creates additional Enums (NullValue) to be added to the Service config.
*/
// TODO (guptasu): Fix this hack. Find a better way to add the predefined types.
// TODO (guptasu): Add them only when required and not in all cases.
static Iterable<Enum> createAdditionalServiceEnums() {
// TODO (guptasu): Remove this hard coding. Without this, creation of Model from Service throws.
// Needs investigation.
String fileName = "struct.proto";
List<Enum> additionalEnums = Lists.newArrayList();
additionalEnums.add(TypesBuilderFromDescriptor.createEnum(NullValue.getDescriptor().getFullName(),
NullValue.getDescriptor().toProto(), fileName));
return additionalEnums;
}
示例14
/**
* Converts Java representation of the given JSON value to protobuf's {@link
* com.google.protobuf.Value} representation.
*
* <p>The given {@code rawObject} must be a valid JSON value in Java representation, which is
* either a {@code Map<String, ?>}, {@code List<?>}, {@code String}, {@code Double},
* {@code Boolean}, or {@code null}.
*/
private static Value convertToValue(Object rawObject) {
Value.Builder valueBuilder = Value.newBuilder();
if (rawObject == null) {
valueBuilder.setNullValue(NullValue.NULL_VALUE);
} else if (rawObject instanceof Double) {
valueBuilder.setNumberValue((Double) rawObject);
} else if (rawObject instanceof String) {
valueBuilder.setStringValue((String) rawObject);
} else if (rawObject instanceof Boolean) {
valueBuilder.setBoolValue((Boolean) rawObject);
} else if (rawObject instanceof Map) {
Struct.Builder structBuilder = Struct.newBuilder();
@SuppressWarnings("unchecked")
Map<String, ?> map = (Map<String, ?>) rawObject;
for (Map.Entry<String, ?> entry : map.entrySet()) {
structBuilder.putFields(entry.getKey(), convertToValue(entry.getValue()));
}
valueBuilder.setStructValue(structBuilder);
} else if (rawObject instanceof List) {
ListValue.Builder listBuilder = ListValue.newBuilder();
List<?> list = (List<?>) rawObject;
for (Object obj : list) {
listBuilder.addValues(convertToValue(obj));
}
valueBuilder.setListValue(listBuilder);
}
return valueBuilder.build();
}
示例15
@Override
public NullValue deserialize(JsonParser parser, DeserializationContext context) throws IOException {
switch (parser.getCurrentToken()) {
case VALUE_NULL:
return NullValue.NULL_VALUE;
default:
context.reportWrongTokenException(NullValue.class, JsonToken.VALUE_NULL, wrongTokenMessage(context));
// the previous method should have thrown
throw new AssertionError();
}
}
示例16
@Override
protected void populate(
Value.Builder builder,
JsonParser parser,
DeserializationContext context
) throws IOException {
switch (parser.getCurrentToken()) {
case START_OBJECT:
Object structValue = readValue(builder, STRUCT_FIELD, null, parser, context);
builder.setField(STRUCT_FIELD, structValue);
return;
case START_ARRAY:
Object listValue = readValue(builder, LIST_FIELD, null, parser, context);
builder.setField(LIST_FIELD, listValue);
return;
case VALUE_STRING:
builder.setStringValue(parser.getText());
return;
case VALUE_NUMBER_INT:
case VALUE_NUMBER_FLOAT:
builder.setNumberValue(parser.getValueAsDouble());
return;
case VALUE_TRUE:
builder.setBoolValue(true);
return;
case VALUE_FALSE:
builder.setBoolValue(false);
return;
case VALUE_NULL:
builder.setNullValue(NullValue.NULL_VALUE);
return;
default:
String message = "Can not deserialize instance of com.google.protobuf.Value out of " + parser.currentToken() + " token";
context.reportInputMismatch(Value.class, message);
// the previous method should have thrown
throw new AssertionError();
}
}
示例17
@Test
public void itWritesAllStructValueTypes() throws IOException {
Value nestedValue = Value.newBuilder().setStringValue("nested").build();
Struct nestedStruct = Struct.newBuilder().putFields("key", nestedValue).build();
ListValue list = ListValue.newBuilder().addValues(nestedValue).build();
Struct struct = Struct
.newBuilder()
.putFields("null", Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build())
.putFields("number", Value.newBuilder().setNumberValue(1.5d).build())
.putFields("string", Value.newBuilder().setStringValue("test").build())
.putFields("boolean", Value.newBuilder().setBoolValue(true).build())
.putFields("struct", Value.newBuilder().setStructValue(nestedStruct).build())
.putFields("list", Value.newBuilder().setListValue(list).build())
.build();
HasStruct message = HasStruct
.newBuilder()
.setStruct(struct)
.build();
String json = camelCase().writeValueAsString(message);
JsonNode node = camelCase().readTree(json).get("struct");
assertThat(node.get("null").isNull()).isTrue();
assertThat(node.get("number").isNumber()).isTrue();
assertThat(node.get("number").numberValue().doubleValue()).isEqualTo(1.5d);
assertThat(node.get("string").isTextual()).isTrue();
assertThat(node.get("string").textValue()).isEqualTo("test");
assertThat(node.get("boolean").isBoolean()).isTrue();
assertThat(node.get("boolean").booleanValue()).isTrue();
assertThat(node.get("struct").isObject()).isTrue();
assertThat(node.get("struct").size()).isEqualTo(1);
assertThat(node.get("struct").get("key").isTextual()).isTrue();
assertThat(node.get("struct").get("key").textValue()).isEqualTo("nested");
assertThat(node.get("list").isArray()).isTrue();
assertThat(node.get("list").size()).isEqualTo(1);
assertThat(node.get("list").get(0).isTextual()).isTrue();
assertThat(node.get("list").get(0).textValue()).isEqualTo("nested");
}
示例18
@Test
public void itWritesNullValue() throws IOException {
HasValue message = HasValue
.newBuilder()
.setValue(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build())
.build();
String json = camelCase().writeValueAsString(message);
assertThat(json).isEqualTo("{\"value\":null}");
}
示例19
@Test
public void itWritesMixedStruct() throws IOException {
Value nestedValue = Value.newBuilder().setStringValue("nested").build();
Struct nestedStruct = Struct.newBuilder().putFields("key", nestedValue).build();
ListValue list = ListValue.newBuilder().addValues(nestedValue).build();
Struct struct = Struct
.newBuilder()
.putFields("null", Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build())
.putFields("number", Value.newBuilder().setNumberValue(1.5d).build())
.putFields("string", Value.newBuilder().setStringValue("test").build())
.putFields("boolean", Value.newBuilder().setBoolValue(true).build())
.putFields("struct", Value.newBuilder().setStructValue(nestedStruct).build())
.putFields("list", Value.newBuilder().setListValue(list).build())
.build();
HasValue message = HasValue
.newBuilder()
.setValue(Value.newBuilder().setStructValue(struct).build())
.build();
String json = camelCase().writeValueAsString(message);
JsonNode node = camelCase().readTree(json).get("value");
assertThat(node.get("null").isNull()).isTrue();
assertThat(node.get("number").isNumber()).isTrue();
assertThat(node.get("number").numberValue().doubleValue()).isEqualTo(1.5d);
assertThat(node.get("string").isTextual()).isTrue();
assertThat(node.get("string").textValue()).isEqualTo("test");
assertThat(node.get("boolean").isBoolean()).isTrue();
assertThat(node.get("boolean").booleanValue()).isTrue();
assertThat(node.get("struct").isObject()).isTrue();
assertThat(node.get("struct").size()).isEqualTo(1);
assertThat(node.get("struct").get("key").isTextual()).isTrue();
assertThat(node.get("struct").get("key").textValue()).isEqualTo("nested");
assertThat(node.get("list").isArray()).isTrue();
assertThat(node.get("list").size()).isEqualTo(1);
assertThat(node.get("list").get(0).isTextual()).isTrue();
assertThat(node.get("list").get(0).textValue()).isEqualTo("nested");
}
示例20
@Test
public void itReadsNullValue() throws IOException {
String json = "{\"value\":null}";
HasValue valueWrapper = camelCase().readValue(json, HasValue.class);
assertThat(valueWrapper.hasValue()).isTrue();
Value value = valueWrapper.getValue();
switch (value.getKindCase()) {
case NULL_VALUE:
assertThat(value.getNullValue()).isEqualTo(NullValue.NULL_VALUE);
break;
default:
fail("Unexpected value kind: " + value.getKindCase());
}
}
示例21
@Test
public void itReadsMixedTypeValues() throws IOException {
String json = "{\"values\":[null,1.5,\"test\",true,{\"key\":\"value\"},[\"nested\"]]}";
RepeatedValue message = camelCase().readValue(json, RepeatedValue.class);
assertThat(message.getValuesCount()).isEqualTo(6);
assertThat(message.getValues(0)).isEqualTo(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build());
assertThat(message.getValues(1)).isEqualTo(Value.newBuilder().setNumberValue(1.5d).build());
assertThat(message.getValues(2)).isEqualTo(Value.newBuilder().setStringValue("test").build());
assertThat(message.getValues(3)).isEqualTo(Value.newBuilder().setBoolValue(true).build());
assertThat(message.getValues(4)).isEqualTo(Value.newBuilder().setStructValue(STRUCT).build());
assertThat(message.getValues(5)).isEqualTo(LIST);
}
示例22
/**
* Converts the value of a BigQuery column in Avro format into the value of a Datastore Entity
* property.
*/
public static Value columnToValue(TableFieldSchema column, Object columnValue)
throws IllegalArgumentException {
String columnName = column.getName();
if (columnValue == null) {
return Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build();
} else {
Value.Builder valueBuilder = Value.newBuilder();
switch (column.getType()) {
case "STRING":
// Datastore string properties greater than 1500 bytes will not be indexed in order to
// respect the limit imposed on the maximum size of index-able string properties. See
// https://cloud.google.com/datastore/docs/concepts/limits
String strValue = columnValue.toString();
valueBuilder.setStringValue(strValue);
boolean excludeFromIndexes = strValue.getBytes().length > MAX_STRING_SIZE_BYTES;
valueBuilder.setExcludeFromIndexes(excludeFromIndexes);
break;
case "INTEGER":
case "INT64":
valueBuilder.setIntegerValue((long) columnValue);
break;
case "FLOAT":
case "FLOAT64":
valueBuilder.setDoubleValue((double) columnValue);
break;
case "BOOLEAN":
case "BOOL":
valueBuilder.setBooleanValue((boolean) columnValue);
break;
case "TIMESTAMP":
// Convert into milliseconds from the BigQuery timestamp, which is in micro seconds
long timeInMillis = ((long) columnValue) / 1000;
valueBuilder.setTimestampValue(Timestamps.fromMillis(timeInMillis));
break;
case "DATE":
case "TIME":
case "DATETIME":
// Handle these types as STRING by default, no dedicated type exists in Datastore
valueBuilder.setStringValue(columnValue.toString());
break;
default:
// TODO: handle nested fields (types "RECORD" or "STRUCT")
throw new IllegalArgumentException(
String.format(
"Column [%s] of type [%s] not supported.", column.getName(), column.getType()));
}
return valueBuilder.build();
}
}
示例23
private StackManipulation printValue(
Map<String, FieldDescription> fieldsByName, ProtoFieldInfo info) {
boolean repeated = !info.isMapField() && info.isRepeated();
switch (info.valueType()) {
case INT32:
case SINT32:
case SFIXED32:
return repeated
? SerializeSupport_printRepeatedSignedInt32
: SerializeSupport_printSignedInt32;
case INT64:
case SINT64:
case SFIXED64:
return repeated
? SerializeSupport_printRepeatedSignedInt64
: SerializeSupport_printSignedInt64;
case BOOL:
return repeated ? SerializeSupport_printRepeatedBool : SerializeSupport_printBool;
case FLOAT:
return repeated ? SerializeSupport_printRepeatedFloat : SerializeSupport_printFloat;
case DOUBLE:
return repeated ? SerializeSupport_printRepeatedDouble : SerializeSupport_printDouble;
case UINT32:
case FIXED32:
return repeated
? SerializeSupport_printRepeatedUnsignedInt32
: SerializeSupport_printUnsignedInt32;
case UINT64:
case FIXED64:
return repeated
? SerializeSupport_printRepeatedUnsignedInt64
: SerializeSupport_printUnsignedInt64;
case STRING:
return repeated ? SerializeSupport_printRepeatedString : SerializeSupport_printString;
case BYTES:
return repeated ? SerializeSupport_printRepeatedBytes : SerializeSupport_printBytes;
case ENUM:
// Special-case google.protobuf.NullValue (it's an Enum).
if (info.valueField().descriptor().getEnumType().equals(NullValue.getDescriptor())) {
return repeated ? SerializeSupport_printRepeatedNull : SerializeSupport_printNull;
} else {
if (printingEnumsAsInts) {
return repeated
? SerializeSupport_printRepeatedUnsignedInt32
: SerializeSupport_printUnsignedInt32;
} else {
return new StackManipulation.Compound(
CodeGenUtil.getEnumDescriptor(info),
repeated ? SerializeSupport_printRepeatedEnum : SerializeSupport_printEnum);
}
}
case MESSAGE:
case GROUP:
return new StackManipulation.Compound(
FieldAccess.forField(
fieldsByName.get(
CodeGenUtil.fieldNameForNestedMarshaller(
info.valueField().descriptor().getMessageType())))
.read(),
repeated ? SerializeSupport_printRepeatedMessage : SerializeSupport_printMessage);
default:
throw new IllegalStateException("Unknown field type.");
}
}
示例24
@Test
public void anyFields() throws Exception {
TestAllTypes content = TestAllTypes.newBuilder().setOptionalInt32(1234).build();
TestAny message = TestAny.newBuilder().setAnyValue(Any.pack(content)).build();
assertMatchesUpstream(message, TestAllTypes.getDefaultInstance());
TestAny messageWithDefaultAnyValue =
TestAny.newBuilder().setAnyValue(Any.getDefaultInstance()).build();
assertMatchesUpstream(messageWithDefaultAnyValue);
// Well-known types have a special formatting when embedded in Any.
//
// 1. Any in Any.
Any anyMessage = Any.pack(Any.pack(content));
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
// 2. Wrappers in Any.
anyMessage = Any.pack(Int32Value.newBuilder().setValue(12345).build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
anyMessage = Any.pack(UInt32Value.newBuilder().setValue(12345).build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
anyMessage = Any.pack(Int64Value.newBuilder().setValue(12345).build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
anyMessage = Any.pack(UInt64Value.newBuilder().setValue(12345).build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
anyMessage = Any.pack(FloatValue.newBuilder().setValue(12345).build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
anyMessage = Any.pack(DoubleValue.newBuilder().setValue(12345).build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
anyMessage = Any.pack(BoolValue.newBuilder().setValue(true).build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
anyMessage = Any.pack(StringValue.newBuilder().setValue("Hello").build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
anyMessage =
Any.pack(BytesValue.newBuilder().setValue(ByteString.copyFrom(new byte[] {1, 2})).build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
// 3. Timestamp in Any.
anyMessage = Any.pack(Timestamps.parse("1969-12-31T23:59:59Z"));
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
// 4. Duration in Any
anyMessage = Any.pack(Durations.parse("12345.10s"));
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
// 5. FieldMask in Any
anyMessage = Any.pack(FieldMaskUtil.fromString("foo.bar,baz"));
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
// 6. Struct in Any
Struct.Builder structBuilder = Struct.newBuilder();
structBuilder.putFields("number", Value.newBuilder().setNumberValue(1.125).build());
anyMessage = Any.pack(structBuilder.build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
// 7. Value (number type) in Any
Value.Builder valueBuilder = Value.newBuilder();
valueBuilder.setNumberValue(1);
anyMessage = Any.pack(valueBuilder.build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
// 8. Value (null type) in Any
anyMessage = Any.pack(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build());
assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance());
}
示例25
@Override
public void setupModule(SetupContext context) {
SimpleSerializers serializers = new SimpleSerializers();
serializers.addSerializer(new MessageSerializer(config));
serializers.addSerializer(new DurationSerializer());
serializers.addSerializer(new FieldMaskSerializer());
serializers.addSerializer(new ListValueSerializer());
serializers.addSerializer(new NullValueSerializer());
serializers.addSerializer(new StructSerializer());
serializers.addSerializer(new TimestampSerializer());
serializers.addSerializer(new ValueSerializer());
serializers.addSerializer(new WrappedPrimitiveSerializer<>(DoubleValue.class));
serializers.addSerializer(new WrappedPrimitiveSerializer<>(FloatValue.class));
serializers.addSerializer(new WrappedPrimitiveSerializer<>(Int64Value.class));
serializers.addSerializer(new WrappedPrimitiveSerializer<>(UInt64Value.class));
serializers.addSerializer(new WrappedPrimitiveSerializer<>(Int32Value.class));
serializers.addSerializer(new WrappedPrimitiveSerializer<>(UInt32Value.class));
serializers.addSerializer(new WrappedPrimitiveSerializer<>(BoolValue.class));
serializers.addSerializer(new WrappedPrimitiveSerializer<>(StringValue.class));
serializers.addSerializer(new WrappedPrimitiveSerializer<>(BytesValue.class));
context.addSerializers(serializers);
context.addDeserializers(new MessageDeserializerFactory(config));
SimpleDeserializers deserializers = new SimpleDeserializers();
deserializers.addDeserializer(Duration.class, new DurationDeserializer());
deserializers.addDeserializer(FieldMask.class, new FieldMaskDeserializer());
deserializers.addDeserializer(ListValue.class, new ListValueDeserializer().buildAtEnd());
deserializers.addDeserializer(NullValue.class, new NullValueDeserializer());
deserializers.addDeserializer(Struct.class, new StructDeserializer().buildAtEnd());
deserializers.addDeserializer(Timestamp.class, new TimestampDeserializer());
deserializers.addDeserializer(Value.class, new ValueDeserializer().buildAtEnd());
deserializers.addDeserializer(DoubleValue.class, wrappedPrimitiveDeserializer(DoubleValue.class));
deserializers.addDeserializer(FloatValue.class, wrappedPrimitiveDeserializer(FloatValue.class));
deserializers.addDeserializer(Int64Value.class, wrappedPrimitiveDeserializer(Int64Value.class));
deserializers.addDeserializer(UInt64Value.class, wrappedPrimitiveDeserializer(UInt64Value.class));
deserializers.addDeserializer(Int32Value.class, wrappedPrimitiveDeserializer(Int32Value.class));
deserializers.addDeserializer(UInt32Value.class, wrappedPrimitiveDeserializer(UInt32Value.class));
deserializers.addDeserializer(BoolValue.class, wrappedPrimitiveDeserializer(BoolValue.class));
deserializers.addDeserializer(StringValue.class, wrappedPrimitiveDeserializer(StringValue.class));
deserializers.addDeserializer(BytesValue.class, wrappedPrimitiveDeserializer(BytesValue.class));
context.addDeserializers(deserializers);
context.setMixInAnnotations(MessageOrBuilder.class, MessageOrBuilderMixin.class);
}
示例26
public NullValueDeserializer() {
super(NullValue.class);
}
示例27
@Override
public NullValue getNullValue(DeserializationContext ctxt) {
return NullValue.NULL_VALUE;
}
示例28
@Override
public Value.Builder getNullValue(DeserializationContext ctxt) {
return Value.newBuilder().setNullValue(NullValue.NULL_VALUE);
}
示例29
public NullValueSerializer() {
super(NullValue.class);
}
示例30
@Override
public void serialize(NullValue value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeNull();
}