If you have a requirement to serialize an object then you have an option to skip serialize specific field by marking it as transient
.
transient
is a Java keyword which marks a member variable not to be serialized when it is persisted to stream of bytes.
When do you need to serialize an object?
When a Java object is transferred through the network, the object needs to be serialized
. Serialization converts the object state to serial bytes.
Let’s take a look at transient Java example
- First let’s create a POJO object CrunchifyTransientVariableObject which implements Serializable.
- Create main class CrunchifyJavaTransientFieldTutorial.
- Create an Object.
- Write an Object to file. A file output stream is an output stream for writing data to a File or to a FileDescriptor.
- Read an Object.
- If field is transient – it will return 0 (for int), null (for string field) and so on.
CrunchifyTransientVariableObject.java
package crunchify.com.tutorial; import java.io.Serializable; // Serializability of a class is enabled by the class implementing the java.io.Serializable interface. // Warning: Deserialization of untrusted data is inherently dangerous and should be avoided. // Untrusted data should be carefully validated according to the "Serialization and Deserialization" section of the . describes best practices for defensive use of serial filters. public class CrunchifyTransientVariableObject implements Serializable { private static final long serialVersionUID = 1L; private String companyName; private int employeeCount; // A transient variable is a variable that can not be serialized. // Variables may be marked transient to indicate that they are not part of the persistent state of an object. private transient int homeZip; // private int homeZip; public String getName() { return companyName; } public void setName(String companyName) { this.companyName = companyName; } public int getEmployeeCount() { return employeeCount; } public void setEmployeeCount(int employeeCount) { this.employeeCount = employeeCount; } public int getZip() { return homeZip; } public void setZip(int homeZip) { this.homeZip = homeZip; } public CrunchifyTransientVariableObject(String companyName, int employeeCount, int homeZip) { this.companyName = companyName; this.employeeCount = employeeCount; this.homeZip = homeZip; } }
Here homeZip
is a transient variable.
CrunchifyJavaTransientFieldTutorial.java
package crunchify.com.tutorial; import java.io.*; /** * @author Crunchify.com * * Java Transient Keyword Tutorial - A transient variable is a variable that can not be serialized. * */ public class CrunchifyJavaTransientFieldTutorial { public static void main(String[] args) { CrunchifyTransientVariableObject crunchifyCompany = new CrunchifyTransientVariableObject("Crunchify.com", 5, 95112); // A file output stream is an output stream for writing data to a File or to a FileDescriptor. try (FileOutputStream crunchifyFOS = new FileOutputStream("crunchify.obj"); ObjectOutputStream crunchifyOOS = new ObjectOutputStream(crunchifyFOS)) { crunchifyOOS.writeObject(crunchifyCompany); crunchifyOOS.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } CrunchifyTransientVariableObject crunchifyResult = null; // A FileInputStream obtains input bytes from a file in a file system. What files are available depends on the host environment. try (FileInputStream crunchifyFOS = new FileInputStream("crunchify.obj"); ObjectInputStream crunchifyOIS = new ObjectInputStream(crunchifyFOS)) { crunchifyResult = (CrunchifyTransientVariableObject) crunchifyOIS.readObject(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("Company Name: " + crunchifyResult.getName()); System.out.println("Number of Employee: " + crunchifyResult.getEmployeeCount()); System.out.println("Zip code: " + crunchifyResult.getZip()); } }
Run program:
With transient keyword:
/Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/Contents/Home/bin/java -javaagent Company Name: Crunchify.com Number of Employee: 5 Zip code: 0 Process finished with exit code 0
Without transient keyword:
Remove transient keyword in above program and re-run a program again.
/Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/Contents/Home/bin/java -javaagent Company Name: Crunchify.com Number of Employee: 5 Zip code: 95112 Process finished with exit code 0
As you see above, now we were able to see zip code 95112.
Please let me know if you see any issue serializing an object and transient variable.