java對象序列化前後大小(java對象的序列化和反序列化)

本文目錄一覽:

Java對象怎麼序列化和反序列化

import java.io.Serializable;

/*

 * NotSerializableException:未序列化異常

 * 

 * 類通過實現 java.io.Serializable 接口以啟用其序列化功能。未實現此接口的類    將無法使其任何狀態序列化或反序列化。

 * 該接口居然沒有任何方法,類似於這種沒有方法的接口被稱為標記接口。

 * 

 * java.io.InvalidClassException: 

 * cn.itcast_07.Person; local class incompatible: 

 * stream classdesc serialVersionUID = -2071565876962058344, 

 * local class serialVersionUID = -8345153069362641443

 * 

 * 為什麼會有問題呢?

 *  Person類實現了序列化接口,那麼它本身也應該有一個標記值。

 *  這個標記值假設是100。

 *  開始的時候:

 *  Person.class — id=100

 *  wirte數據: oos.txt — id=100

 *  read數據: oos.txt — id=100

 * 

 *  現在:

 *  Person.class — id=200

 *  wirte數據: oos.txt — id=100

 *  read數據: oos.txt — id=100

 * 在實際開發中,可能還需要使用以前寫過的數據,不能重新寫入。怎麼辦呢?

 * 回想一下原因是因為它們的id值不匹配。

 * 每次修改java文件的內容的時候,class文件的id值都會發生改變。

 * 而讀取文件的時候,會和class文件中的id值進行匹配。所以,就會出問題。

 * 但是呢,如果有辦法,讓這個id值在java文件中是一個固定的值,這樣,你修改文件的時候,這個id值還會發生改變嗎?

 * 不會。現在的關鍵是我如何能夠知道這個id值如何表示的呢?

 * 不用擔心,不用記住,也沒關係,點擊鼠標即可。

 * 難道沒有看到黃色警告線嗎?

 * 

 * 要知道的是:

 *  看到類實現了序列化接口的時候,要想解決黃色警告線問題,就可以自動產生一個序列化id值。

 *  而且產生這個值以後,我們對類進行任何改動,它讀取以前的數據是沒有問題的。

 * 

 * 注意:

 *  一個類中可能有很多的成員變量,有些我不想進行序列化。請問該怎麼辦呢?

 *  使用transient關鍵字聲明不需要序列化的成員變量

 */

public class Person implements Serializable {

private static final long serialVersionUID = -2071565876962058344L;

private String name;

// private int age;

private transient int age;

// int age;

public Person() {

super();

}

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

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;

}

@Override

public String toString() {

return “Person [name=” + name + “, age=” + age + “]”;

}

}

JAVA 對象序列化問題,高手求教!

我查了java的JDK幫助文檔,發現沒有關於readObject()函數是否讀到文件末尾的判斷方法,後來問了老師後說是可以在序列化輸出文件的時候在多輸出一個特定的類對象,如一個空對象,然後每次讀一個對象之後先判斷該對象是否滿足你指定的條件,如果不滿足則繼續往下讀,否則退出while循環。這也是一種編程的技巧。

java對象序列化問題

你可以參考以下程序中序列化的方法將你圖片封裝到一個類中,然後讓此類實現Serializable接口。。。

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

/**

*

* @author top

*/

public class Inout {

/**

* @param args the command line arguments

*/

public static void main(String[] args) throws Exception {

// TODO code application logic here

Student student1 = new Student(“top_beidu”, 23, 99.9f);

Student student2 = new Student(“student2”, 24, 69.9f);

Student student3 = new Student(“student3”, 25, 89.9f);

System.out.println(“輸入的是:”);

student1.print();

student2.print();

student3.print();

FileOutputStream fos = new FileOutputStream(“student.txt”);

// FileOutputStream fos = new FileOutputStream(“F:/student.txt”);

ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(student1);

oos.writeObject(student2);

oos.writeObject(student3);

oos.close();

FileInputStream fis = new FileInputStream(“student.txt”);

// FileInputStream fis = new FileInputStream(“F:/student.txt”);

ObjectInputStream ois = new ObjectInputStream(fis);

Student stu1 = (Student) ois.readObject();

Student stu2 = (Student) ois.readObject();

Student stu3 = (Student) ois.readObject();

System.out.println(“輸出的是:”);

stu1.print();

stu2.print();

stu3.print();

ois.close();

}

}

class Student implements Serializable {

private String name;

private int age;

private float score;

public Student(String name, int age, float score) {

this.name = name;

this.age = age;

this.score = score;

}

public void print() {

System.out.println(“name=” + name + “;age=” + age + “;score=” + score);

}

}

java中為什麼要進行對象序列化?

對象的序列化就是為了數據傳輸,在你的代碼的里是對象格式,而在傳輸的時候不可能還保持這對象的樣子。

當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方需要把這個java對象轉換為位元組序列,才能在網絡上傳送;接收方則需要把位元組序列再恢復為java對象。

1.概念

序列化:把java對象轉換為位元組序列的過程。

反序列化:把位元組序列恢復為java對象的過程。

2.用途

對象的序列化主要有兩種用途:

1)

把對象的位元組序列永久地保存到硬盤上,通常存放在一個文件中;

2)

在網絡上傳送對象的位元組序列。

Java中對象序列化的作用是什麼?全面一點,謝謝

1、序列化是幹什麼的?

簡單說就是為了保存在內存中的各種對象的狀態,並且可以把保存的對象狀態再讀出來。雖然你可以用你自己的各種各樣的方法來保存Object States,但是Java給你提供一種應該比你自己好的保存對象狀態的機制,那就是序列化。

2、什麼情況下需要序列化

a)當你想把的內存中的對象保存到一個文件中或者數據庫中時候;

b)當你想用套接字在網絡上傳送對象的時候;

c)當你想通過RMI傳輸對象的時候;

3、當對一個對象實現序列化時,究竟發生了什麼?

在沒有序列化前,每個保存在堆(Heap)中的對象都有相應的狀態(state),即實例變量(instance ariable)比如:

Foo myFoo = new Foo();

myFoo .setWidth(37);

myFoo.setHeight(70);

當通過下面的代碼序列化之後,MyFoo對象中的width和Height實例變量的值(37,70)都被保存到foo.ser文件中,這樣以後又可以把它 從文件中讀出來,重新在堆中創建原來的對象。當然保存時候不僅僅是保存對象的實例變量的值,JVM還要保存一些小量信息,比如類的類型等以便恢復原來的對 象。

FileOutputStream fs = new FileOutputStream(“foo.ser”);

ObjectOutputStream os = new ObjectOutputStream(fs);

os.writeObject(myFoo);

4、實現序列化(保存到一個文件)的步驟

a)Make a FileOutputStream

java 代碼

FileOutputStream fs = new FileOutputStream(“foo.ser”);

b)Make a ObjectOutputStream

java 代碼

ObjectOutputStream os = new ObjectOutputStream(fs);

c)write the object

java 代碼

os.writeObject(myObject1);

os.writeObject(myObject2);

os.writeObject(myObject3);

d) close the ObjectOutputStream

java 代碼

os.close();

5、舉例說明

java 代碼

import java.io.*;

public class Box implements Serializable

{

private int width;

private int height;

public void setWidth(int width){

this.width = width;

}

public void setHeight(int height){

this.height = height;

}

public static void main(String[] args){

Box myBox = new Box();

myBox.setWidth(50);

myBox.setHeight(30);

try{

FileOutputStream fs = new FileOutputStream(“foo.ser”);

ObjectOutputStream os = new ObjectOutputStream(fs);

os.writeObject(myBox);

os.close();

}catch(Exception ex){

ex.printStackTrace();

}

}

}

6、相關注意事項

a)當一個父類實現序列化,子類自動實現序列化,不需要顯式實現Serializable接口;

b)當一個對象的實例變量引用其他對象,序列化該對象時也把引用對象進行序列化;

c)並非所有的對象都可以序列化,,至於為什麼不可以,有很多原因了,比如:

1.安全方面的原因,比如一個對象擁有private,public等field,對於一個要傳輸的對象,比如寫到文件,或者進行rmi傳輸 等等,在序列化進行傳輸的過程中,這個對象的private等域是不受保護的。

2. 資源分配方面的原因,比如socket,thread類,如果可以序列化,進行傳輸或者保存,也無法對他們進行重新的資源分 配,而且,也是沒有必要這樣實現。

為什麼JAVA對象需要實現序列化

序列化是一種用來處理對象流的機制

所謂對象流就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。

序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是為了標註該對象是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流;

什麼時候使用序列化:

一:對象序列化可以實現分佈式對象。主要應用例如:RMI(即遠程調用Remote Method Invocation)要利用對象序列化運行遠程主機上的服務,就像在本地機上運行對象時一樣。

二:java對象序列化不僅保留一個對象的數據,而且遞歸保存對象引用的每個對象的數據。可以將整個對象層次寫入位元組流中,可以保存在文件中或在網絡連接上傳遞。利用對象序列化可以進行對象的”深複製”,即複製對象本身及引用的對象本身。序列化一個對象可能得到整個對象序列。

三:序列化可以將內存中的類寫入文件或數據庫中。比如將某個類序列化後存為文件,下次讀取時只需將文件中的數據反序列化就可以將原先的類還原到內存中。也可以將類序列化為流數據進行傳輸。總的來說就是將一個已經實例化的類轉成文件存儲,下次需要實例化的時候只要反序列化即可將類實例化到內存中並保留序列化時類中的所有變量和狀態。

四: 對象、文件、數據,有許多不同的格式,很難統一傳輸和保存

序列化以後就都是位元組流了,無論原來是什麼東西,都能變成一樣的東西,就可以進行通用的格式傳輸或保存,傳輸結束以後,要再次使用,就進行反序列化還原,這樣對象還是對象,文件還是文件

因為JAVA中要將對象序列化 為 流 的 形式進行傳輸

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/186582.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-27 05:47
下一篇 2024-11-27 05:47

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • 金額選擇性序列化

    本文將從多個方面對金額選擇性序列化進行詳細闡述,包括其定義、使用場景、實現方法等。 一、定義 金額選擇性序列化指根據傳入的金額值,選擇是否進行序列化,以達到減少數據傳輸的目的。在實…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論