Serialization

VelocyPack serialization

Since version 4.1.11 you can extend the VelocyPack serialization by registering additional VPackModules on ArangoDB.Builder.

Java 8 types

GitHub: github.com/arangodb/java-velocypack-module-jdk8

Added support for:

  • java.time.Instant
  • java.time.LocalDate
  • java.time.LocalDateTime
  • java.time.ZonedDateTime
  • java.time.OffsetDateTime
  • java.time.ZoneId
  • java.util.Optional
  • java.util.OptionalDouble
  • java.util.OptionalInt
  • java.util.OptionalLong
<dependencies>
  <dependency>
    <groupId>com.arangodb</groupId>
    <artifactId>velocypack-module-jdk8</artifactId>
    <version>1.1.0</version>
  </dependency>
</dependencies>
ArangoDB arangoDB = new ArangoDB.Builder().registerModule(new VPackJdk8Module()).build();

Scala types

GitHub: github.com/arangodb/java-velocypack-module-scala

Added support for:

  • scala.Option
  • scala.collection.immutable.List
  • scala.collection.immutable.Map
  • scala.math.BigInt
  • scala.math.BigDecimal
<dependencies>
  <dependency>
    <groupId>com.arangodb</groupId>
    <artifactId>velocypack-module-scala</artifactId>
    <version>1.0.2</version>
  </dependency>
</dependencies>
val arangoDB: ArangoDB = new ArangoDB.Builder().registerModule(new VPackScalaModule).build

Joda-Time

GitHub: github.com/arangodb/java-velocypack-module-joda

Added support for:

  • org.joda.time.DateTime
  • org.joda.time.Instant
  • org.joda.time.LocalDate
  • org.joda.time.LocalDateTime
<dependencies>
  <dependency>
    <groupId>com.arangodb</groupId>
    <artifactId>velocypack-module-joda</artifactId>
    <version>1.1.1</version>
  </dependency>
</dependencies>
ArangoDB arangoDB = new ArangoDB.Builder().registerModule(new VPackJodaModule()).build();

Use of jackson as an alternative serializer

Since version 4.5.2, the driver supports alternative serializer to de-/serialize documents, edges and query results. One implementation is VelocyJack which is based on Jackson working with jackson-dataformat-velocypack.

Note: Any registered custom serializer/deserializer or module will be ignored.

JavaBeans

The driver can serialize/deserialize JavaBeans. They need at least a constructor without parameter.

public class MyObject {

  private String name;
  private Gender gender;
  private int age;

  public MyObject() {
    super();
  }

}

Internal fields

To use Arango-internal fields (like _id, _key, _rev, _from, _to) in your JavaBeans, use the annotation DocumentField.

public class MyObject {

  @DocumentField(Type.KEY)
  private String key;

  private String name;
  private Gender gender;
  private int age;

  public MyObject() {
    super();
  }

}

Serialized fieldnames

To use a different serialized name for a field, use the annotation SerializedName.

public class MyObject {

  @SerializedName("title")
  private String name;

  private Gender gender;
  private int age;

  public MyObject() {
    super();
  }

}

Ignore fields

To ignore fields at serialization/deserialization, use the annotation Expose

public class MyObject {

  @Expose
  private String name;
  @Expose(serialize = true, deserialize = false)
  private Gender gender;
  private int age;

  public MyObject() {
    super();
  }

}

Custom serializer

ArangoDB arangoDB = new ArangoDB.Builder().registerModule(new VPackModule() {
  @Override
  public <C extends VPackSetupContext<C>> void setup(final C context) {
    context.registerDeserializer(MyObject.class, new VPackDeserializer<MyObject>() {
      @Override
      public MyObject deserialize(VPackSlice parent,VPackSlice vpack,
          VPackDeserializationContext context) throws VPackException {
        MyObject obj = new MyObject();
        obj.setName(vpack.get("name").getAsString());
        return obj;
      }
    });
    context.registerSerializer(MyObject.class, new VPackSerializer<MyObject>() {
      @Override
      public void serialize(VPackBuilder builder,String attribute,MyObject value,
          VPackSerializationContext context) throws VPackException {
        builder.add(attribute, ValueType.OBJECT);
        builder.add("name", value.getName());
        builder.close();
      }
    });
  }
}).build();

Disable type hints

The Java VelocyPack library automatically adds a type hint field (named _class by default) to help figure out the correct class to instantiate during the deserialization phase. In case you want to use custom deserializers, this feature can be disabled in the following way:

ArangoDB arangoDB = new ArangoDB.Builder()
        .registerModule(new VPackModule() {
            @Override
            public <C extends VPackSetupContext<C>> void setup(final C context) {
                context.useTypeHints(false);
            }
        })
        .build();

Manual serialization

To de-/serialize from and to VelocyPack before or after a database call, use the ArangoUtil from the method util() in ArangoDB, ArangoDatabase, ArangoCollection, ArangoGraph, ArangoEdgeCollectionor ArangoVertexCollection.

ArangoDB arangoDB = new ArangoDB.Builder();
VPackSlice vpack = arangoDB.util().serialize(myObj);
ArangoDB arangoDB = new ArangoDB.Builder();
MyObject myObj = arangoDB.util().deserialize(vpack, MyObject.class);