--- layout: default description: Serialization --- # Serialization ## VelocyPack serialization Since version `4.1.11` you can extend the VelocyPack serialization by registering additional `VPackModule`s on `ArangoDB.Builder`. ### Java 8 types GitHub: [github.com/arangodb/java-velocypack-module-jdk8](https://github.com/arangodb/java-velocypack-module-jdk8){:target="_blank"} 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` ```XML com.arangodb velocypack-module-jdk8 1.1.0 ``` ```Java ArangoDB arangoDB = new ArangoDB.Builder().registerModule(new VPackJdk8Module()).build(); ``` ### Scala types GitHub: [github.com/arangodb/java-velocypack-module-scala](https://github.com/arangodb/java-velocypack-module-scala){:target="_blank"} Added support for: - `scala.Option` - `scala.collection.immutable.List` - `scala.collection.immutable.Map` - `scala.math.BigInt` - `scala.math.BigDecimal` ```XML com.arangodb velocypack-module-scala 1.0.2 ``` ```Scala val arangoDB: ArangoDB = new ArangoDB.Builder().registerModule(new VPackScalaModule).build ``` ### Joda-Time GitHub: [github.com/arangodb/java-velocypack-module-joda](https://github.com/arangodb/java-velocypack-module-joda){:target="_blank"} Added support for: - `org.joda.time.DateTime` - `org.joda.time.Instant` - `org.joda.time.LocalDate` - `org.joda.time.LocalDateTime` ```XML com.arangodb velocypack-module-joda 1.1.1 ``` ```Java 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](https://github.com/arangodb/jackson-dataformat-velocypack#within-arangodb-java-driver){:target="_blank"} which is based on [Jackson](https://github.com/FasterXML/jackson){:target="_blank"} working with [jackson-dataformat-velocypack](https://github.com/arangodb/jackson-dataformat-velocypack){:target="_blank"}. **Note**: Any registered custom [serializer/deserializer or module](#custom-serialization) will be ignored. ## custom serialization ```Java ArangoDB arangoDB = new ArangoDB.Builder().registerModule(new VPackModule() { @Override public > void setup(final C context) { context.registerDeserializer(MyObject.class, new VPackDeserializer() { @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() { @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(); ``` ## JavaBeans The driver can serialize/deserialize JavaBeans. They need at least a constructor without parameter. ```Java 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`. ```Java 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`. ```Java 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` ```Java public class MyObject { @Expose private String name; @Expose(serialize = true, deserialize = false) private Gender gender; private int age; public MyObject() { super(); } } ``` ## Custom serializer ```Java ArangoDB arangoDB = new ArangoDB.Builder().registerModule(new VPackModule() { @Override public > void setup(final C context) { context.registerDeserializer(MyObject.class, new VPackDeserializer() { @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() { @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(); ``` ## 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`, `ArangoEdgeCollection`or `ArangoVertexCollection`. ```Java ArangoDB arangoDB = new ArangoDB.Builder(); VPackSlice vpack = arangoDB.util().serialize(myObj); ``` ```Java ArangoDB arangoDB = new ArangoDB.Builder(); MyObject myObj = arangoDB.util().deserialize(vpack, MyObject.class); ```