簡介
假設我有一些生魚,想讓它們保持新鮮1到2天,然後再吃。現在我要做的是保持它們的新鮮,我會把它們放在冰箱裏冷凍。但吃的時候,我得把它們解凍。簡單地說,將項目凍結為凍結形式稱為序列化。將冰冷形式轉換為正常形式的相反過程稱為反序列化。
現在在計算中,它與上麵的例子非常相似,但是是以一種相當技術的方式。在本文中,我們將了解java中的序列化和反序列化是如何工作的。
什麼是Java中的序列化和反序列化?
序列化是將對象轉換為字節序列的過程,從java支持的形式轉換為文件支持的形式或網絡支持的形式。而使用字節序列創建更多對象以將對象從文件支持的形式轉換為java支持的形式的反向過程稱為反序列化。
不要搞混了,這不是將對象的狀態保存到文件的過程;嚴格地說,它是將一個對象從java支持的形式到文件支持的形式或網絡支持的形式。
序列化是如何工作的?
考慮一個JVM,其對象具有特定的值,並且JVM運行在機器(例如machine 1)中。現在讓我們考慮一下,我們需要在另一台機器(比如machine 2)中使用相同的對象和相同的對象值再次創建這個JVM。這就是需要序列化技術的情況。JVM通過創建一個隻有機器和網絡才能理解的字節序列來完成這個序列化過程,並通過網絡發送這些字節序列。隻有在實現名為serializable的接口時,該過程才會啟動。
機器1
機器2
序列化過程
進口. io . *;它是在序列化程序開始時需要導入的包,如果沒有它,編譯器將以輸出消息的形式顯示錯誤。
FileOutputStream是一個用於連接到預先存在的文件或創建一個文件然後連接到它的類。
FileOutputStream fos=new FileOutputStream(" abc.ser ");
文件ObjectOutputStream是在FileoutputStream的幫助下用於在文件中寫入對象的類。
ObjectOutputStream os = new ObjectOutputStream (fos);
反序列化過程
FileInputStream是一個連接文件進行反序列化的類
FileInputStream fin = new FileInputStream(" abc.ser ");
如果文件不存在,它將發送消息
文件不存在
ObjectInputStream是主要用於將文件數據轉換為對象的類。
ObjectInputStream = new ObjectInputStream (fis);
序列化的例子
進口. io . *;類Doll實現Serializable {int i = 10;Int j = 20;}類SerializeDemo{公共靜態無效主(字符串[]args)拋出異常{娃娃d1=新娃娃();FileOutputStream fos = new FileOutputStream("abc.ser");ObjectOutputStream oos =新的ObjectOutputStream(fos);oos。writeObject (d1);System.out.println(“成功”);}}
輸出
java SerializeDemo
Process started (PID=4536) >>> .日誌含義
成功
在上麵的例子中,首先創建一個新文件,然後序列化對象的值。對象的值被轉換為字節流。
反序列化的例子
進口. io . *;類Doll實現Serializable {int i = 10;Int j = 20;}類SerializeDemo{公共靜態無效主(字符串[]args)拋出異常{娃娃d1=新娃娃();FileOutputStream fos = new FileOutputStream("abc.ser");ObjectOutputStream oos =新的ObjectOutputStream(fos);oos。writeObject (d1);FileInputStream fis = new FileInputStream("abc.ser");ObjectInputStream ois = new ObjectInputStream(fis); Doll d2 = (Doll)ois.readObject(); System.out.println(d2.i+"__"+d2.j); } }
輸出
java SerializeDemo
Process started (PID=12356) >>> .日誌含義
10 __20
在上麵的示例中,文件的字節流被反序列化並轉換為java支持的形式。
對象abc.ser內容的序列化版本
í sr DollxRl ß I ixp
什麼是暫態關鍵字
Transient是隻適用於變量的修飾符。假設我們有多個變量,但是變量中的一些值或數據是敏感的或機密的,並且我們不想與任何人共享這些數據,那麼我們必須將這些變量視為瞬態變量,即如果我們不想在序列化時保存任何變量的值以滿足安全約束,那麼它被稱為瞬態變量。在序列化期間被認為是瞬態的值將不會被保存,並且在反序列化之後,我們將不會得到該變量的值。
語法
為了使任何值都是瞬態的,隻需將關鍵字transient放在值transient int j = 20之前;
例子
進口. io . *;類Doll實現Serializable {int i = 10;暫態int = 20;}類SerializeDemo{公共靜態無效主(字符串[]args)拋出異常{娃娃d1=新娃娃();FileOutputStream fos = new FileOutputStream("abc.ser");ObjectOutputStream oos =新的ObjectOutputStream(fos);oos。writeObject (d1);FileInputStream fis = new FileInputStream("abc.ser");ObjectInputStream ois = new ObjectInputStream(fis); Doll d2 = (Doll)ois.readObject(); System.out.println(d2.i+"__"+d2.j); } }
輸出
java SerializeDemo
Process started (PID=12356) >>> .日誌含義
10 __0
這裏j的值變成0,因為j沒有序列化,因為我們把transient關鍵字放在j之前。
transient關鍵字隻能用於類級變量;記住,不是針對對象變量。
什麼是靜態變量?
靜態變量是那些不能序列化的變量,在反序列化過程之後,它們將從類中加載。
什麼是實例變量?
實例變量是那些可以序列化的變量,在反序列化過程中,我們將得到原始狀態的值。
在java中序列化的需求是什麼?
1.序列化是一種技術,它允許我們將對象的狀態保存為字節序列,並幫助將其保存在硬盤上或通過網絡保存到其他機器上。
2.序列化通過將數據(即對象從一台機器發送到另一台機器)幫助節省時間
3.序列化可以自由地用於更大的任意複雜數據集。
4.序列化是一個獨立於平台的過程。在一個平台上序列化的對象可以在其他各種平台上反序列化。
Java中的掃描器類
簡介
用戶輸入是任何編程語言中最重要的部分之一。Java是允許用戶從鍵盤輸入的高級語言之一。在本文中,您將簡要了解它背後的過程。
什麼是java掃描器類?
Scanner類用於從用戶使用鍵盤獲取int、double、string等輸入。
導入掃描器類
首先,需要導入一個名為java.util.Scanner的類。然後將創建掃描器類的對象。輸入是使用內置方法獲取的。
掃描器類中的方法
nextBoolean () | 它用於從用戶讀取布爾值 |
nextByte () | 用於從用戶處讀取字節值 |
nextDouble () | 用於從用戶讀取double值 |
nextFloat () | 用於從用戶讀取浮點值 |
nextInt () | 用於從用戶讀取int值 |
nextLine () | 用於從用戶讀取String值 |
nextLong () | 用於從用戶讀取長值 |
nextShort () | 用於從用戶讀取短值 |
如何使用掃描器類
語法:
Scanner myObj = new Scanner(System.in);
在上麵的語法中,第一個scanner是類的名稱,myObj是變量,第二個scanner是scanner類和係統的構造函數。In是參數。這意味著我們正在創建一個從參數中讀取數據的對象。係統。In是指向鍵盤的輸入字符串。它用於從鍵盤上讀取輸入。
例子
進口java.util.Scanner;class check1 {public static void main(String[] args) {Scanner myObj = new Scanner(System.in);system . out。println("輸入姓名、年齡和工資:");字符串名稱= myObj.nextLine();int age = myObj.nextInt();double salary = myObj.nextDouble();system . out。println("Name: " + Name);system . out。println("Age: " + age); System.out.println("Salary: " + salary); } }
輸出
java check1
Process started (PID=11700) >>> .日誌含義
輸入姓名、年齡和工資:
拉維
45
45000
名稱:拉維
年齡:45
工資:45000.0
在上麵的例子中,用戶被要求輸入姓名、年齡和工資,然後計算機依次顯示輸出。我們已經使用了三個方法next line, nextInt和nextDouble。下一行將讀取一個字符串;nextInt將讀取整數值,nextDouble將從用戶讀取一個雙精度值。
如果你想學習更多關於java的知識,試試這個免費的Java程序設計課程提高你的技能。