Skip to content

Commit e67163e

Browse files
committed
Merge remote-tracking branch 'fork/master' into tags
2 parents 07ee9ed + 6524a8c commit e67163e

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

src/main/java/com/arangodb/velocypack/VPack.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,8 @@ private void addValue(
876876
} else if (type instanceof Class && Map.class.isAssignableFrom((Class<?>) type)) {
877877
serializeMap(name, value, builder, String.class, additionalFields);
878878
} else if (type instanceof Class && ((Class) type).isArray()) {
879-
serializeArray(name, value, builder);
879+
final Type elemType = ((Class<?>) type).getComponentType();
880+
serializeArray(name, value, builder, elemType);
880881
} else if (type instanceof Class && ((Class) type).isEnum()) {
881882
builder.add(name, Enum.class.cast(value).name());
882883
} else if (type != value.getClass()) {
@@ -888,13 +889,14 @@ private void addValue(
888889
}
889890
}
890891

891-
private void serializeArray(final String name, final Object value, final VPackBuilder builder)
892+
private void serializeArray(final String name, final Object value, final VPackBuilder builder, final Type type)
892893
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, VPackException {
893894
builder.add(name, ValueType.ARRAY);
894895
for (int i = 0; i < Array.getLength(value); i++) {
895896
final Object element = Array.get(value, i);
896897
if (element != null) {
897-
addValue(null, element.getClass(), element, builder, null, Collections.<String, Object>emptyMap());
898+
final Type t = type != null ? type : element.getClass();
899+
addValue(null, t, element, builder, null, Collections.<String, Object> emptyMap());
898900
} else {
899901
builder.add(ValueType.NULL);
900902
}

src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4074,6 +4074,56 @@ public void objectList() {
40744074
assertThat(entityOut.value.get(0) instanceof TestEntityTypeInfo, is(true));
40754075
}
40764076

4077+
static class TestEntityObjectArray {
4078+
Object[] value;
4079+
}
4080+
4081+
@Test
4082+
public void heterogeneousArray() {
4083+
final TestEntityObjectArray entity = new TestEntityObjectArray();
4084+
entity.value = new Object[]{new TestEntityTypeInfo()};
4085+
4086+
final VPack vpack = new VPack.Builder().build();
4087+
final VPackSlice slice = vpack.serialize(entity);
4088+
4089+
assertThat(slice.isObject(), is(true));
4090+
assertThat(slice.get("value").isArray(), is(true));
4091+
assertThat(slice.get("value").get(0).isObject(), is(true));
4092+
assertThat(slice.get("value").get(0).get("_class").isString(), is(true));
4093+
assertThat(slice.get("value").get(0).get("_class").getAsString(),
4094+
is("com.arangodb.velocypack.VPackSerializeDeserializeTest$TestEntityTypeInfo"));
4095+
4096+
final TestEntityObjectArray entityOut = vpack.deserialize(slice, TestEntityObjectArray.class);
4097+
assertThat(entityOut, is(notNullValue()));
4098+
assertThat(entityOut.value, is(notNullValue()));
4099+
assertThat(entityOut.value.length, is(1));
4100+
assertThat(entityOut.value[0] instanceof TestEntityTypeInfo, is(true));
4101+
}
4102+
4103+
static class TestEntityTypeInfoArray {
4104+
TestEntityTypeInfo[] value;
4105+
}
4106+
4107+
@Test
4108+
public void homogeneousArray() {
4109+
final TestEntityTypeInfoArray entity = new TestEntityTypeInfoArray();
4110+
entity.value = new TestEntityTypeInfo[]{new TestEntityTypeInfo()};
4111+
4112+
final VPack vpack = new VPack.Builder().build();
4113+
final VPackSlice slice = vpack.serialize(entity);
4114+
4115+
assertThat(slice.isObject(), is(true));
4116+
assertThat(slice.get("value").isArray(), is(true));
4117+
assertThat(slice.get("value").get(0).isObject(), is(true));
4118+
assertThat(slice.get("value").get(0).get("_class").isNone(), is(true));
4119+
4120+
final TestEntityTypeInfoArray entityOut = vpack.deserialize(slice, TestEntityTypeInfoArray.class);
4121+
assertThat(entityOut, is(notNullValue()));
4122+
assertThat(entityOut.value, is(notNullValue()));
4123+
assertThat(entityOut.value.length, is(1));
4124+
assertThat(entityOut.value[0], notNullValue());
4125+
}
4126+
40774127
public static class Limb {
40784128
}
40794129

0 commit comments

Comments
 (0)