diff --git a/libraries/pom.xml b/libraries/pom.xml
index a655f5267a..9e8ff9b9ab 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -453,6 +453,11 @@
pcollections
${pcollections.version}
+
+ com.esotericsoftware
+ kryo
+ ${kryo.version}
+
0.7.0
@@ -493,5 +498,6 @@
1.6.0
1.7.1
2.1.2
+ 4.0.1
diff --git a/libraries/src/main/java/com/baeldung/kryo/ComplexClass.java b/libraries/src/main/java/com/baeldung/kryo/ComplexClass.java
new file mode 100644
index 0000000000..0e125e48a9
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/kryo/ComplexClass.java
@@ -0,0 +1,16 @@
+package com.baeldung.kryo;
+
+import java.io.Serializable;
+
+public class ComplexClass implements Serializable{
+ private static final long serialVersionUID = 123456L;
+ private String name = "Bael";
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/libraries/src/main/java/com/baeldung/kryo/Person.java b/libraries/src/main/java/com/baeldung/kryo/Person.java
new file mode 100644
index 0000000000..f9be5cfd62
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/kryo/Person.java
@@ -0,0 +1,54 @@
+package com.baeldung.kryo;
+
+import com.esotericsoftware.kryo.DefaultSerializer;
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.KryoSerializable;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import java.util.Date;
+
+@DefaultSerializer(PersonSerializer.class)
+public class Person implements KryoSerializable {
+ private String name = "John Doe";
+ private int age = 18;
+ private Date birthDate = new Date(933191282821L);
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public Date getBirthDate() {
+ return birthDate;
+ }
+
+ public void setBirthDate(Date birthDate) {
+ this.birthDate = birthDate;
+ }
+
+ @Override
+ public void write(Kryo kryo, Output output) {
+ output.writeString(name);
+ output.writeLong(birthDate.getTime());
+ output.writeInt(age);
+ }
+
+ @Override
+ public void read(Kryo kryo, Input input) {
+ name = input.readString();
+ birthDate = new Date(input.readLong());
+ age = input.readInt();
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/kryo/PersonSerializer.java b/libraries/src/main/java/com/baeldung/kryo/PersonSerializer.java
new file mode 100644
index 0000000000..f5d01509a6
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/kryo/PersonSerializer.java
@@ -0,0 +1,33 @@
+package com.baeldung.kryo;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import java.util.Date;
+
+public class PersonSerializer extends Serializer {
+
+ @Override
+ public void write(Kryo kryo, Output output, Person object) {
+ output.writeString(object.getName());
+ output.writeLong(object.getBirthDate()
+ .getTime());
+ }
+
+ @Override
+ public Person read(Kryo kryo, Input input, Class type) {
+ Person person = new Person();
+ person.setName(input.readString());
+ long birthDate = input.readLong();
+ person.setBirthDate(new Date(birthDate));
+ person.setAge(calculateAge(birthDate));
+ return person;
+ }
+
+ private int calculateAge(long birthDate) {
+ // Some custom logic
+ return 18;
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/kryo/KryoUnitTest.java b/libraries/src/test/java/com/baeldung/kryo/KryoUnitTest.java
new file mode 100644
index 0000000000..c124ca618d
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/kryo/KryoUnitTest.java
@@ -0,0 +1,125 @@
+package com.baeldung.kryo;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.util.Date;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.serializers.JavaSerializer;
+
+public class KryoUnitTest {
+
+ private Kryo kryo;
+ private Output output;
+ private Input input;
+
+ @Before
+ public void init() {
+ kryo = new Kryo();
+ try {
+ output = new Output(new FileOutputStream("file.dat"));
+ input = new Input(new FileInputStream("file.dat"));
+ } catch (FileNotFoundException ex) {
+ Logger.getLogger(KryoUnitTest.class.getName())
+ .log(Level.SEVERE, null, ex);
+ }
+ }
+
+ @Test
+ public void givenObject_whenSerializing_thenReadCorrectly() {
+ Object someObject = "Some string";
+
+ kryo.writeClassAndObject(output, someObject);
+ output.close();
+
+ Object theObject = kryo.readClassAndObject(input);
+ input.close();
+
+ assertEquals(theObject, "Some string");
+ }
+
+ @Test
+ public void givenObjects_whenSerializing_thenReadCorrectly() {
+ String someString = "Multiple Objects";
+ Date someDate = new Date(915170400000L);
+
+ kryo.writeObject(output, someString);
+ kryo.writeObject(output, someDate);
+ output.close();
+
+ String readString = kryo.readObject(input, String.class);
+ Date readDate = kryo.readObject(input, Date.class);
+ input.close();
+
+ assertEquals(readString, "Multiple Objects");
+ assertEquals(readDate.getTime(), 915170400000L);
+ }
+
+ @Test
+ public void givenPerson_whenSerializing_thenReadCorrectly() {
+ Person person = new Person();
+
+ kryo.writeObject(output, person);
+ output.close();
+
+ Person readPerson = kryo.readObject(input, Person.class);
+ input.close();
+
+ assertEquals(readPerson.getName(), "John Doe");
+ }
+
+ @Test
+ public void givenPerson_whenUsingCustomSerializer_thenReadCorrectly() {
+ Person person = new Person();
+ person.setAge(0);
+ kryo.register(Person.class, new PersonSerializer());
+
+ kryo.writeObject(output, person);
+ output.close();
+
+ Person readPerson = kryo.readObject(input, Person.class);
+ input.close();
+
+ assertEquals(readPerson.getName(), "John Doe");
+ assertEquals(readPerson.getAge(), 18);
+ }
+
+ @Test
+ public void givenPerson_whenCustomSerialization_thenReadCorrectly() {
+ Person person = new Person();
+
+ kryo.writeObject(output, person);
+ output.close();
+
+ Person readPerson = kryo.readObject(input, Person.class);
+ input.close();
+
+ assertEquals(readPerson.getName(), "John Doe");
+ assertEquals(readPerson.getAge(), 18);
+ }
+
+ @Test
+ public void givenJavaSerializable_whenSerializing_thenReadCorrectly() {
+ ComplexClass complexClass = new ComplexClass();
+ kryo.register(ComplexClass.class, new JavaSerializer());
+
+ kryo.writeObject(output, complexClass);
+ output.close();
+
+ ComplexClass readComplexObject = kryo.readObject(input, ComplexClass.class);
+ input.close();
+
+ assertEquals(readComplexObject.getName(), "Bael");
+ }
+
+}