本文目錄一覽:
- 1、Java代碼如何反序列化PHP序列化數組後的字元串
- 2、什麼是java的序列化和反序列化?
- 3、在JAVA中什麼叫序列化和反序列化?
- 4、什麼是Java中的序列化和反序列化?
- 5、怎麼用java把一個字元串中的數據反序列化
- 6、Java對象怎麼序列化和反序列化
Java代碼如何反序列化PHP序列化數組後的字元串
public class ByteTest { public static void main(String[] args) { String str = “Hello world!”; // string轉byte byte[] bs = str.getBytes(); System.out.println(Arrays.toString(bs)); // byte轉string String str2 = new String(bs); System.out.println(str2); } }
什麼是java的序列化和反序列化?
1、什麼是序列化?為什麼要序列化?
Java 序列化就是指將對象轉換為位元組序列的過程,而反序列化則是只將位元組序列轉換成目標對象的過程。
我們都知道,在進行瀏覽器訪問的時候,我們看到的文本、圖片、音頻、視頻等都是通過二進位序列進行傳輸的,那麼如果我們需要將Java對象進行傳輸的時候,是不是也應該先將對象進行序列化?答案是肯定的,我們需要先將Java對象進行序列化,然後通過網路,IO進行傳輸,當到達目的地之後,再進行反序列化獲取到我們想要的對象,最後完成通信。
2、如何實現序列化
2.1、使用到JDK中關鍵類 ObjectOutputStream 和ObjectInputStream
ObjectOutputStream 類中:通過使用writeObject(Object object) 方法,將對象以二進位格式進行寫入。
ObjectInputStream 類中:通過使用readObject()方法,從輸入流中讀取二進位流,轉換成對象。
2.2、目標對象需要先實現 Seriable介面
我們創建一個Student類:
public class Student implements Serializable {
private static final long serialVersionUID = 3404072173323892464L;
private String name;
private transient String id;
private String age;
@Override
public String toString() {
return “Student{” +
“name='” + name + ‘\” +
“, id='” + id + ‘\” +
“, age='” + age + ‘\” +
‘}’;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Student(String name, String id) {
System.out.println(“args Constructor”);
this.name = name;
this.id = id;
}
public Student() {
System.out.println(“none-arg Constructor”);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
代碼中Student類實現了Serializable 介面,並且生成了一個版本號:
private static final long serialVersionUID = 3404072173323892464L;
首先:
1、Serializable 介面的作用只是用來標識我們這個類是需要進行序列化,並且Serializable 介面中並沒有提供任何方法。
2、serialVersionUid 序列化版本號的作用是用來區分我們所編寫的類的版本,用於判斷反序列化時類的版本是否一直,如果不一致會出現版本不一致異常。
3、transient 關鍵字,主要用來忽略我們不希望進行序列化的變數
2.3、將對象進行序列或和反序列化
如果你想學習Java可以來這個群,首先是一二六,中間是五三四,最後是五一九,裡面有大量的學習資料可以下載。
2.3.1 第一種寫入方式:
public static void main(String[] args){
File file = new File(“D:/test.txt”);
Student student = new Student(“孫悟空”,”12″);
try {
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(student);
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
Student s = (Student) objectInputStream.readObject();
System.out.println(s.toString());
System.out.println(s.equals(student));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
創建對象Student ,然後通過ObjectOutputStream類中的writeObject()方法,將對象輸出到文件中。
然後通過ObjectinputStream 類中的readObject()方法反序列化,獲取對象。
2.3.2 第二種寫入方式:
在Student 類中實現writeObject()和readObject()方法:
private void writeObject(ObjectOutputStream objectOutputStream) throws IOException {
objectOutputStream.defaultWriteObject();
objectOutputStream.writeUTF(id);
}
private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
objectInputStream.defaultReadObject();
id = objectInputStream.readUTF();
}
通過這中方式進行序列話,我們可以自定義想要進行序列化的變數,將輸入流和輸出流傳入對線實例中,然後進行序列化以及反序列化。
在JAVA中什麼叫序列化和反序列化?
java對象實現了序列化就可以以對象的形式在流中傳輸。不管是文件流,還是Socket流都可以\x0d\x0a 用ObjectInputStream ObjectOutputStream 來讀寫對象。\x0d\x0a 並不是所以類都可以序列化,一般需要序列化的對象是那些實體類。什麼Bean,pojo,vo貌似都是一個意思吧。。。還是有一些對象是不能序列化的,Socket對象是不能的。還有一些忘記了,還有一些不知道···呵呵~~\x0d\x0a 實現序列化只要實現一個Serializable的介面就行,這是個標誌介面,裡面沒有方法需要實現,主要的作用就是標識這兒類可以序列化·····
什麼是Java中的序列化和反序列化?
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網路之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。
序列化的實現:將需要被序列化的類實現Serializable介面,該介面沒有需要實現的方法,implements
Serializable只是為了標註該對象是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object
obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
怎麼用java把一個字元串中的數據反序列化
如果是Json字元串的話,你只要解析就行了
解析json的框架有Gson JSONObject 等開源框架
JSONObject obj = new JSONObject(json字元串);
取值方法有:
obj.getString(key);
obj.getJSONObject(key);
obj.getJSONArray(key);
更多請查看api
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 + “]”;
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/239646.html