本文目錄一覽:
- 1、Java對象怎麼序列化和反序列化
- 2、JAVA 對象序列化問題,高手求教!
- 3、java對象序列化問題
- 4、java中為什麼要進行對象序列化?
- 5、Java中對象序列化的作用是什麼?全面一點,謝謝
- 6、為什麼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-hant/n/186582.html