Learnitweb

static transient field and final transient field

The question is sometimes asked as – Can we define a field as ‘static transient’ and ‘final transient’ field?

Yes, we can define a field as ‘static transient’. We don’t receive any error and compiler doesn’t complain. However, this is not useful as static fields are not serialized. Static variables belong to a class and not to any individual instance. Serialization is meant to persist the object’s state. Therefore, static fields are ignored during serialization.

Similarly, we can define a field as ‘final transient’. We don’t receive any for this as well. final variables participate in serialization directly by their values.

‘static transient’ field example

import java.io.*;

class Student implements Serializable {
	int rollNo = 100;
	static transient int age = 25;
}

class SerializationExample {
	public static void main(String args[]) throws Exception {
		Student d1 = new Student();
		
		System.out.println("Serialization started");
		FileOutputStream fos = new FileOutputStream("test.ser");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(d1);
		System.out.println("Serialization ended");
		
		System.out.println("Deserialization started");
		FileInputStream fis = new FileInputStream("test.ser");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Student d2 = (Student) ois.readObject();
		System.out.println("Deserialization ended");
		
		System.out.println("rollNo: " + d2.rollNo);
		System.out.println("age: " + d2.age);
	}
}

Output

Serialization started
Serialization ended
Deserialization started
Deserialization ended
rollNo: 100
age: 25

‘final transient’ field example

import java.io.*;

class Student implements Serializable {
	int rollNo = 100;
	final transient int age = 25;
}

class SerializationExample {
	public static void main(String args[]) throws Exception {
		Student d1 = new Student();
		
		System.out.println("Serialization started");
		FileOutputStream fos = new FileOutputStream("test.ser");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(d1);
		System.out.println("Serialization ended");
		
		System.out.println("Deserialization started");
		FileInputStream fis = new FileInputStream("test.ser");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Student d2 = (Student) ois.readObject();
		System.out.println("Deserialization ended");
		
		System.out.println("rollNo: " + d2.rollNo);
		System.out.println("age: " + d2.age);
	}
}

Output

Serialization started
Serialization ended
Deserialization started
Deserialization ended
rollNo: 100
age: 25

Summary

DeclarationOutput
int rollNo = 100;
int age = 25;
rollNo: 100
age: 25
transient int rollNo = 100;
int age = 25;
rollNo: 0
age: 25
transient int rollNo = 100;
transient static int age = 25;
rollNo: 0
age: 25
transient final int rollNo = 100;
transient int age = 25;
rollNo: 100
age: 0