java反序列化php,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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:17
下一篇 2024-12-12 12:17

相關推薦

  • 金額選擇性序列化

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

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

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

    編程 2025-04-29
  • Java JsonPath 效率優化指南

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

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

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

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

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

    編程 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

發表回復

登錄後才能評論