BAEL-1023 Introduction to Kryo (#2336)
This commit is contained in:
parent
34a793a0fc
commit
4441d969fa
|
@ -453,6 +453,11 @@
|
||||||
<artifactId>pcollections</artifactId>
|
<artifactId>pcollections</artifactId>
|
||||||
<version>${pcollections.version}</version>
|
<version>${pcollections.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.esotericsoftware</groupId>
|
||||||
|
<artifactId>kryo</artifactId>
|
||||||
|
<version>${kryo.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<properties>
|
<properties>
|
||||||
<multiverse.version>0.7.0</multiverse.version>
|
<multiverse.version>0.7.0</multiverse.version>
|
||||||
|
@ -493,5 +498,6 @@
|
||||||
<hll.version>1.6.0</hll.version>
|
<hll.version>1.6.0</hll.version>
|
||||||
<bytebuddy.version>1.7.1</bytebuddy.version>
|
<bytebuddy.version>1.7.1</bytebuddy.version>
|
||||||
<pcollections.version>2.1.2</pcollections.version>
|
<pcollections.version>2.1.2</pcollections.version>
|
||||||
|
<kryo.version>4.0.1</kryo.version>
|
||||||
</properties>
|
</properties>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<Person> {
|
||||||
|
|
||||||
|
@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<Person> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue