Java >> Java tutorial >  >> Tag >> transient

Java – Forbigående nøgleord med serialisering

I denne artikel vil vi diskutere forbigående søgeord eller modifikator med serialisering i detaljer

Når som helst taler vi om Serialisering så vil der helt sikkert væremasser af spørgsmål på forbigående søgeord

Det er også et af de foretrukne interviewspørgsmål i Java

1. Serialiseringsproces:

  • Under serialiseringsprocessen, dvs.; gemmer tilstanden for et objekt til fil, alle instansvariabler vil blive deltaget og vedblev til fillagring
  • variabler med statiske modifikator vil blive udeladt

Sp) Hvad hvis vi ikke ønsker at serialisere specifikke variabler/attributter af sikkerhedsmæssige årsager?

  • Svaret er at erklære det medlem variabel med transient modifikator
  • Ja, vi kan stoppe vedvarende specifik variabel under serialiseringsprocessen ved at erklære transient modifikator for den specifikke variabel

2. forbigående søgeord:

  • Forbigående søgeord eller modifikator er kun anvendelig for variabler
  • Vi kan stoppe vedvarende specifik variabel ved at erklære forbigående søgeord
  • Under serialisering ignorerer JVM den oprindelige værdi af transient variabel og gemmer standardværdi til fil
  • Eksempler: Kundens SSN eller adgangskode behøver ikke at blive gemt . Derfor er det en god praksis at erklære disse variabler som forbigående
  • Så hver gang vi støder på forbigående søgeord, betyder det, at ikke at serialisere

3. Demoeksempel på forbigående søgeord

  • For objekter at deltage i serialiserings- og deserialiseringsprocessen, tilsvarende klasse skal implementere java.io.Serializable grænseflade
  • Ellers NotSerializableException vil blive smidt

Trin 1:Opret POJO, som implementerer java.io.Serializable grænseflade

  • I Kunde POJO er der 4 medlemsvariabler med customerSSN erklæret med forbigående søgeord
  • Hvilket betyder, under serialisering i stedet for den oprindelige værdi, standardværdi vil blive gemt i filen
  • Dette kan bevises ved at afserialisere serialiseret objekt

Customer.java

package in.bench.resources.serialization;

import java.io.Serializable;

public class Customer implements Serializable {

	// member variables
	int customerId;
	String customerName;
	int customerAge;
	transient int customerSSN;

	// 4-arg parameterized constructor
	public Customer(int customerId, String customerName,
			int customerAge, int customerSSN) {
		super();
		this.customerId = customerId;
		this.customerName = customerName;
		this.customerAge = customerAge;
		this.customerAge = customerAge;
	}

	// overriding toString() method
	@Override
	public String toString() {
		return "Customer ["
				+ "customerId=" + customerId
				+ ", customerName=" + customerName
				+ ", customerAge="  + customerAge
				+ ", customerSSN=" + customerSSN
				+ "]";
	}
}

Trin 2:Hovedprogram til demonstration af serialisering/de-serialisering

  • For at serialisere ethvert objekt, kan vi bruge ObjectOutputStream &FileOutputStream for at skrive/gemme til fil i binært format
  • For at afserialisere ethvert objekt, kan vi bruge ObjectInputStream &FileInputStream for at læse/gendanne fra fil (som er i binært format) til Java heap memory

TransientDemo.java

package in.bench.resources.serialization;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class TransientDemo {

	public static void main(String[] args) {

		// create an customer instance using 4-arg constructor
		Customer serializeCustomer =
				new Customer(102, "SR", 17, 112569);

		// creating output stream variables
		FileOutputStream fos = null;
		ObjectOutputStream oos = null;

		// creating input stream variables
		FileInputStream fis = null;
		ObjectInputStream ois = null;

		// creating customer object reference
		// to hold values after de-serialization
		Customer deSerializeCustomer = null;

		try {
			// for writing or saving binary data
			fos = new FileOutputStream("Customer.ser");

			// converting java-object to binary-format
			oos = new ObjectOutputStream(fos);

			// writing or saving customer object's value to stream
			oos.writeObject(serializeCustomer);
			oos.flush();
			oos.close();

			System.out.println("Serialization success: Customer "
					+ "object saved to Customer.ser file\n");

			// reading binary data
			fis = new FileInputStream("Customer.ser");

			// converting binary-data to java-object
			ois = new ObjectInputStream(fis);

			// reading object's value and casting to Customer class
			deSerializeCustomer = (Customer) ois.readObject();
			ois.close();

			System.out.println("De-Serialization success: Customer "
					+ "object de-serialized from Customer.ser file\n");
		}
		catch (FileNotFoundException fnfex) {
			fnfex.printStackTrace();
		}
		catch (IOException ioex) {
			ioex.printStackTrace();
		}
		catch (ClassNotFoundException ccex) {
			ccex.printStackTrace();
		}

		// printing customer object to console using toString() method
		System.out.println("Printing customer values from "
				+ "de-serialized object... \n" + deSerializeCustomer);
	}
}

Output:

Serialization success: Customer object saved to Customer.ser file

De-Serialization success: Customer object de-serialized
from Customer.ser file

Printing customer values from de-serialized object...
Customer [customerId=102, customerName=SR, customerAge=17, customerSSN=0]

Forklaring:

  • I ovenstående kunde POJO, customerSSN erklæret som forbigående
  • Så under serialiseringsprocessen vil den oprindelige værdi af customerSSN ikke blive gemt til fil
  • I stedet bliver standardværdien gemt (dvs. 0 for int, null for streng osv.)
  • 1 st halvdelen af programmet illustrere serialisering proces
  • Og 2 nd halvdelen omhandler afserialiseringsprocessen , som afserialiserer det serialiserede objekt
  • Mens de-serialisering af alle instansmedlemmer værdier er genoprettet perfekt undtagen kundeSSN
  • Årsag: fordi dette er markeret med forbigående søgeord

Konklusion:

  • Så ved at erklære instansvariabel med forbigående søgeord, vi kan begrænse til at gemme/gemme den pågældende variabel i fil lagring underserialiseringsprocessen
  • Og det afhænger udelukkende af forretningskrav det, som alle instansvariabler skal begrænses


Java tag