日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

序列化与反序列化(1)Serializable —— Java原生态方法

發布時間:2023/12/10 java 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 序列化与反序列化(1)Serializable —— Java原生态方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘自:序列化與反序列化(1)Serializable —— Java原生態方法
作者:丶PURSUING
發布時間: 2021-05-08 19:20:21
網址:https://blog.csdn.net/weixin_44742824/article/details/116503261

本文為學習筆記,所用的圖片、案例均為教學視頻截圖

源視頻地址:Android開發基礎教程(2019)第35集 序列化(1)
作者:longway777

何為序列化

將對象轉換為字節序列,完整的保存在磁盤上,或者通過網絡發送出去。

反序列化就是將對象重新創建出來

序列化的三種方式

Serializable

java自帶的接口,使用起來很簡單,只需要一句話的標注就可以,具體實現也不需要做,全部是由jdk完成。缺點是效率不高,但對于應用程序級別已經夠用。

Parcelable

專為安卓定制,深度優化,效率很高,在安卓系統的底層扮演了非常重要的角色,進程調度交換數據,交換對象等必不可少。

Json

基于文本的序列化,相對于二進制文件文本具有很高的可讀性,廣泛應用。

效果演示

本篇章先使用第一個方法,Serializable 實現對象的序列化以及反序列化。

通過輸入內容,點擊Save按鈕后將對象保存在文件中(序列化),點擊load讀取文件中的內容,反序列化使對象重建并顯示在屏幕上。

一、創建界面

二、創建student類

創建student類,包含屬性名字、姓名、分數等,類要實現接口:Serializable。并且設置getter、setter,實現構造方法等。(具體看最后的源碼)

alt+insert,選擇構造,創建他們三個的構造方法。

完成他們的setter和gerter

三、點擊按鈕創建對象寫入到文件中

try catch

沒有處理可能發生的異常
這種IO的操作,包括像是網絡的操作,是不可靠的,不一定成功,可能會出錯(比如文件不存在,磁盤故障),所以需要做異常處理避免應用程序產生異常而崩潰。

嘗試執行

嘗試執行try里面的內容,如果不成功就會返回一個異常值,這里把他打印出來。

舉一個很簡單的例子
并且程序沒有閃退
SAVE完成后,點擊執行:

在文件系統中可以找到創建的文件

是二進制序列的字節文件,看著像是亂碼

可以用hex轉換工具大致看看

toast的快速自動補全

輸入Toast按下tab鍵自動補全

四、點擊按鈕反序列化重建對象

可能的錯誤,兩個catch

快速try

點擊按鈕后反序列化并且對象重建在屏幕上

關鍵代碼

雖然代碼看似很多,但序列化真正涉及到的就是序列化后寫入文件中,然后反序列化讀出來,還有類要繼承的接口

student.java

創建student類,包含屬性名字、姓名、分數等,類要實現接口:Serializable。并且設置getter、setter,實現構造方法等。

//如果某個屬性不需要序列化,可以添加關鍵字:transient public class Student implements Serializable {private String name;private int age;private Score score;public Student(String name, int age, Score score) {this.name = name;this.age = age;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Score getScore() {return score;}public void setScore(Score score) {this.score = score;} }class Score implements Serializable{private int math;private int english;private int chinese;private String grade;public Score(int math, int english, int chinese) {this.math = math;this.english = english;this.chinese = chinese;if(math>=90 && english>=90 && chinese>=90){this.grade = "A";}else if(math>=80 && english>=80 && chinese>=80){this.grade = "B";}else {this.grade = "C";}}public int getMath() {return math;}public void setMath(int math) {this.math = math;}public int getEnglish() {return english;}public void setEnglish(int english) {this.english = english;}public int getChinese() {return chinese;}public void setChinese(int chinese) {this.chinese = chinese;}public String getGrade() {return grade;} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

MainActivity.java

public class MainActivity extends AppCompatActivity {EditText editTextName,editTextAge,editTextMath,editTextEnglish,editTextChinese;Button buttonSave,buttonLoad;TextView textViewGrade;//定義文件名為一個常量private static final String FILE_NAME = "myfile.data";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*引入一個錯誤,觀察try catch的機制int x = 5;//除以0是算數上的一個錯誤,應用程序會馬上崩潰閃退try {x = x / 0;// 錯誤類型為算數錯誤}catch (ArithmeticException e){Log.e("calError", "onCreate: "+e);}*/editTextName = findViewById(R.id.name);editTextAge = findViewById(R.id.age);editTextMath = findViewById(R.id.math);editTextEnglish = findViewById(R.id.eng);editTextChinese = findViewById(R.id.chinese);buttonSave = findViewById(R.id.button);buttonLoad = findViewById(R.id.button2);//之前因為缺少這一句,導致對象沒有實例化所以軟件閃退textViewGrade = findViewById(R.id.textView);buttonSave.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//點擊保存后,創建變量,對象保存數據int math = Integer.valueOf(editTextMath.getText().toString());int english = Integer.valueOf(editTextEnglish.getText().toString());int chinese = Integer.valueOf(editTextChinese.getText().toString());Score score = new Score(math,english,chinese);String name = editTextName.getText().toString();int age = Integer.valueOf(editTextAge.getText().toString());Student student = new Student(name,age,score);try {//將對象序列化寫入到文件中,借助下面這個接口,針對應用程序而言,是輸出,輸出到文件中// 第一個參數是文件的名稱,第二個是讀寫的模式(這里選擇覆蓋)ObjectOutputStream objectOutputStream = new ObjectOutputStream(openFileOutput(FILE_NAME,MODE_PRIVATE));//把對象寫入文件objectOutputStream.writeObject(student);objectOutputStream.flush();//清空緩沖區objectOutputStream.close();Toast.makeText(MainActivity.this,"data saved!",Toast.LENGTH_SHORT).show();//sava之后把頁面數據清空用來呈現load的數據editTextChinese.getText().clear();editTextEnglish.getText().clear();editTextMath.getText().clear();editTextName.getText().clear();editTextAge.getText().clear();textViewGrade.setText("-");//抓住的錯誤類型為IOException}catch (IOException e){//這里不做其他處理,僅觀察Log.e("IO", "IO error " , e);}}});//讀取,反系列化buttonLoad.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {ObjectInputStream objectInputStream = new ObjectInputStream(openFileInput(FILE_NAME));// 類型強制轉換為Student類Student student = (Student)objectInputStream.readObject();//對象重建顯示在頁面上editTextName.setText(student.getName());editTextAge.setText(String.valueOf(student.getAge()));editTextMath.setText(String.valueOf(student.getScore().getMath()));editTextEnglish.setText(String.valueOf(student.getScore().getEnglish()));editTextChinese.setText(String.valueOf(student.getScore().getChinese()));textViewGrade.setText(student.getScore().getGrade());} catch (IOException | ClassNotFoundException e) {Log.e("IO", "onClick: ", e);}}});} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

總結

以上是生活随笔為你收集整理的序列化与反序列化(1)Serializable —— Java原生态方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。