Serialization and Deserialization
In this lesson, we will see what serialization and deserialization of requests is.
What is serialization?
Serialization is the process of converting objects into a stream of data.
What is deserialization?
Deserialization is the process of converting a stream of data into objects.
The main purpose of serialization and deserialization is to persist the data and recreate it whenever needed.
We have considered the Rest Assured
library for making REST API calls. We will keep the scope within those capabilities of Rest Assured
and the libraries it depends on.
As we keep learning about REST API automation and the data that is exchanged between client and server is of JSON format, we will learn how to serialize objects into a stream of JSON data and deserialize stream of data to objects that are exchanged between the REST web service.
Rest Assured
can use the Jackson 2 library,
GSON library or Jackson library for serialization and deserialization. The internal behavior of io.restassured.mapper.ObjectMapper
is dependent on the library in the classpath.
Sample data for demonstration & understanding the data
We will use the Jackson 2 library for serialization and deserialization purposes, for which we will ensure the following dependency from here is added:
-
Maven
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.3</version> </dependency>
-
Gradle
compile 'com.fasterxml.jackson.core jackson-databind:2.10.3'
Let us consider the class Student
for demonstration purposes.
import com.fasterxml.jackson.annotation.JsonProperty;
public class Student {
@JsonProperty("id")
private Long id;
@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
@JsonProperty("gender")
private String gender;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return String.format("Student [id=%s, firstName=%s, lastName=%s, gender=%s]", id, firstName, lastName, gender);
}
}
The above class Student
contains the following:
Fields
– id, firstName, lastName, genderGetters
– for fetching the field valuesSetters
– for setting the field valuestoString()
– for printing the object
As we can see in the Student
class, all the fields are annotated with @JsonProperty
.
The purpose of having that annotation over the fields is that, during the process of serialization to JSON or deserialization from JSON, we need to know what key the fields should be mapped to.
As per Java conventions, we tend to name all the field names in camel case. The Jackson library, by default, takes the field name as the key during the process of serialization and deserialization. However, sometimes, we may want to have a different key for the field during the process. For that purpose, we use @JsonProperty
which overrides the default behavior and the String
given in the annotation will be taken as the key for that field.
@JsonProperty
can be annotated over setter methods also. If the annotation is given in both
places, we get the following exception:
java.lang.IllegalStateException: Conflicting/ambiguous property name definitions (implicit name 'firstName'): found multiple explicit names: [f_name, first_name], but also implicit accessor: [method restassured.Student#getFirstName(0 params)][visible=true,ignore=false,explicitName=false]
The Jackson library provides us with so many other annotations to help us override the default behavior of the library upon fields during the process of serialization and deserialization. To know more, please follow this link.
How to serialize an object?
Now, we will see how to set Java objects to request the body of an API so that Rest Assured
can serialize the object into a stream of JSON data before making the API call.
Get hands-on with 1200+ tech skills courses.