 
- Java.io - Home
- Java.io - BufferedInputStream
- Java.io - BufferedOutputStream
- Java.io - BufferedReader
- Java.io - BufferedWriter
- Java.io - ByteArrayInputStream
- Java.io - ByteArrayOutputStream
- Java.io - CharArrayReader
- Java.io - CharArrayWriter
- Java.io - Console
- Java.io - DataInputStream
- Java.io - DataOutputStream
- Java.io - File
- Java.io - FileDescriptor
- Java.io - FileInputStream
- Java.io - FileOutputStream
- Java.io - FilePermission
- Java.io - FileReader
- Java.io - FileWriter
- Java.io - FilterInputStream
- Java.io - FilterOutputStream
- Java.io - FilterReader
- Java.io - FilterWriter
- Java.io - InputStream
- Java.io - InputStreamReader
- Java.io - LineNumberInputStream
- Java.io - LineNumberReader
- Java.io - ObjectInputStream
- Java.io - ObjectInputStream.GetField
- Java.io - ObjectOutputStream
- io - ObjectOutputStream.PutField
- Java.io - ObjectStreamClass
- Java.io - ObjectStreamField
- Java.io - OutputStream
- Java.io - OutputStreamWriter
- Java.io - PipedInputStream
- Java.io - PipedOutputStream
- Java.io - PipedReader
- Java.io - PipedWriter
- Java.io - PrintStream
- Java.io - PrintWriter
- Java.io - PushbackInputStream
- Java.io - PushbackReader
- Java.io - RandomAccessFile
- Java.io - Reader
- Java.io - SequenceInputStream
- Java.io - SerializablePermission
- Java.io - StreamTokenizer
- Java.io - StringBufferInputStream
- Java.io - StringReader
- Java.io - StringWriter
- Java.io - Writer
- Java.io package Useful Resources
- Java.io - Discussion
Java - ObjectInputStream readFields() method
Description
The Java ObjectInputStream readFields() method reads the persistent fields of a serialized object. readFields() returns an ObjectInputStream.GetField object, which allows retrieving individual fields.
Declaration
Following is the declaration for java.io.ObjectInputStream.readFields() method −
public ObjectInputStream.GetField readFields()
Parameters
NA
Return Value
This method returns the GetField object representing the persistent fields of the object being deserialized.
Exception
- ClassNotFoundException − If the class of a serialized object could not be found. 
- IOException − If an I/O error has occurred. 
- NotActiveException − If the stream is not currently reading objects. 
Example - Usage of ObjectInputStream readFields() method
The following example shows the usage of Java ObjectInputStream readFields() method.
ObjectInputStreamDemo.java
package com.tutorialspoint;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ObjectInputStreamDemo {
   public static void main(String[] args) {
      try {
         // create a new file with an ObjectOutputStream
         FileOutputStream out = new FileOutputStream("test.txt");
         ObjectOutputStream oout = new ObjectOutputStream(out);
         // write something in the file
         oout.writeObject(new Example());
         oout.flush();
         // create an ObjectInputStream for the file we created before
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
         // read the object and print the string
         Example a = (Example) ois.readObject();
         // print the string that is in Example class
         System.out.println("" + a.s);
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
   static class Example implements Serializable {
      String s = "Hello World!";
      private String readObject(ObjectInputStream in) 
         throws IOException, ClassNotFoundException {
         // call readFields in readObject
         ObjectInputStream.GetField gf = in.readFields();
         // save the string and return it
         return (String) gf.get("s", null);
      }
   }
}
Output
Let us compile and run the above program, this will produce the following result−
Hello World!
Example - Reading Fields along with Missing Fields
The following example shows the usage of Java ObjectInputStream readFields() method. This example demonstrates how readFields() can handle missing fields gracefully.
ObjectInputStreamDemo.java
package com.tutorialspoint;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ObjectInputStreamDemo {
   public static void main(String[] args) {
      try {
         // Serialize Employee object (older version might not have 'salary' field)
         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("employee.dat"));
         oos.writeObject(new Employee("Alice", 30, 8000.0));
         oos.close();
         // Deserialize Employee object (simulate reading an old version without 'salary')
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("employee.dat"));
         Employee emp = (Employee) ois.readObject();
         ois.close();
         System.out.println("Deserialized Employee: " + emp);
      } catch (IOException | ClassNotFoundException e) {
         e.printStackTrace();
      }
   }
   static class Employee implements Serializable {
      private static final long serialVersionUID = 1L;
      String name;
      int age;
      double salary; // New field, not present in old serialized objects
      public Employee(String name, int age, double salary) {
         this.name = name;
         this.age = age;
         this.salary = salary;
      }
      private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
         ObjectInputStream.GetField fields = ois.readFields(); // Read serialized fields
         name = (String) fields.get("name", "Unknown"); // Default if missing
         age = fields.get("age", 0); // Default if missing
         salary = fields.get("salary", 5000.0); // Default value for missing salary field
      }
      @Override
      public String toString() {
         return "Employee{name='" + name + "', age=" + age + ", salary=" + salary + "}";
      }
   }
}
Output
Let us compile and run the above program, this will produce the following result−
Deserialized Employee: Employee{name='Alice', age=30, salary=8000.0}
Explanation
- Serializes an Employee object (in older versions, the salary field might be missing). 
- Reads fields using readFields(). 
- Assigns default values ("Unknown" for name, 0 for age, 5000.0 for salary) if missing. 
Example - Handling Extra Fields in a New Version of a Class
The following example shows the usage of Java ObjectInputStream readFields() method. This example handles additional fields in a new version of a class, ensuring backward compatibility.
ObjectInputStreamDemo.java
package com.tutorialspoint;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ObjectInputStreamDemo {
   public static void main(String[] args) {
      try {
         // Serialize Product object (simulating older version)
         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("product.dat"));
         oos.writeObject(new Product("Laptop", 1200.99, "IdeaPad")); // No 'category' field
         oos.close();
         // Deserialize using the new Product class
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("product.dat"));
         Product product = (Product) ois.readObject();
         ois.close();
         System.out.println("Deserialized Product: " + product);
      } catch (IOException | ClassNotFoundException e) {
         e.printStackTrace();
      }
   }
   static class Product implements Serializable {
      private static final long serialVersionUID = 1L;
      String name;
      double price;
      String category; 
      public Product(String name, double price, String category) {
         this.name = name;
         this.price = price;
         this.category = category;
      }
      private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
         ObjectInputStream.GetField fields = ois.readFields(); // Read serialized fields
         name = (String) fields.get("name", "Unknown");
         price = fields.get("price", 0.0);
         category = (String)fields.get("category", "Uncategorized"); // Default value for missing category field
      }
      @Override
      public String toString() {
         return "Product{name='" + name + "', price=" + price + ", category='" + category + "'}";
      }
   }
}
Output
Let us compile and run the above program, this will produce the following result−
Deserialized Product: Product{name='Laptop', price=1200.99, category='IdeaPad'}
Explanation
- Serializes an OldProduct object, which lacks the category field. 
- Reads fields using readFields(), allowing retrieval of old values. 
- Assigns "Uncategorized" as a default for missing category.