纸上得来终觉浅,绝知此事要躬行 --陆游 问渠那得清如许,为有源头活水来 --朱熹
什么是Java序列化?为什么出现Java序列化?怎样实现Java序列化?
一、什么是Java序列化
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。
二、为什么出现Java序列化
两个进程之间进行通信时,需要传输各种信息,比如文本,图像,声音等等,这些信息是通过二进制流的形式进行传输的。
那么进程之间是不是也可以传递对象数据呢?答案是可以的。Java的序列化和反序列化就是将Java对象转化为字节序列,并
在网络上进行传输,反序列化将获得的字节序列数据生成对象。
三、怎样实现Java序列化
1)、对象的输入输出:ObjectInputStream,ObjectOutputStream。
2)、对象要实现Serializable或者Externalizable接口,否则会抛出异常。
注意:在Serializable中声明为static和transient类型的成员数据不能被序列化。
实现Serializable接口的序列化和反序列化示例程序:
public class Student implements Serializable { private String name; private char sex; public Student() { } public Student(String name,char sex) { this.name = name; this.sex = sex; } public void setName(String name) { this.name = name; } public void setSex(char sex) { this.sex = sex; } public String getName() { return this.name; } public char getSex() { return this.sex; } } public class UseStudent { public static void main(String[] args) { Student st = new Student("Tom",'M'); File file = new File("O:\\Java\\com\\jieke\\io\\student.txt"); try { file.createNewFile(); } catch(IOException e) { e.printStackTrace(); } try { //Student对象序列化过程 FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(st); oos.flush(); oos.close(); fos.close(); //Student对象反序列化过程 FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); Student st1 = (Student) ois.readObject(); System.out.println("name = " + st1.getName()); System.out.println("sex = " + st1.getSex()); ois.close(); fis.close(); } catch(ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
使用Externalizable接口进行序列化,必须要重写writeExternal(ObjectOutput output)和readExternal(ObjectInput input)方法
使用该接口的序列化方法需要我们来实现,因此可以对static和transient数据进行序列化。
public class Person implements Externalizable { private static final long serialVersionUID = -842029427676826563L; public static String name; private int age; private transient int workDay = 5; private String fClub; public Person() { System.out.println("none-arg constructor"); } public Person(int age, String fClub) { this.age = age; this.fClub = fClub; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getWorkDay() { return workDay; } public void setWorkDay(int workDay) { this.workDay = workDay; } public String getfClub() { return fClub; } public void setfClub(String fClub) { this.fClub = fClub; } private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject();//执行默认的序列化机制 out.writeInt(workDay); System.out.println("正在进行序列持久化"); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); workDay = in.readInt(); System.out.println("读取持久化对象"); } @Override public void readExternal(ObjectInput arg0) throws IOException, ClassNotFoundException { // TODO Auto-generated method stub } @Override public void writeExternal(ObjectOutput arg0) throws IOException { // TODO Auto-generated method stub } } public class Hello { public static void main(String[] args) { Person person = new Person(26, "Juventus"); person.setWorkDay(7); try { FileOutputStream fs = new FileOutputStream("foo.ser"); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject(person); os.close(); Person.name = "Alex"; FileInputStream in = new FileInputStream("foo.ser"); ObjectInputStream s = new ObjectInputStream(in); Person p = (Person) s.readObject(); System.out.println("name==" + Person.name + " age==" + p.getAge() + " workDay==" + p.getWorkDay() + " fClub==" + p.getfClub()); } catch (Exception e) { e.printStackTrace(); } } }
当然还有很多开源的序列化和反序列化的库,可以在实际的工程中进行使用。
相关文章:
java 序列化对象 serializable 读写数据的实例
以上是Java序列化Serializable和Externalizable差異的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JVMmanagesgarbagecollectionacrossplatformseffectivelybyusingagenerationalapproachandadaptingtoOSandhardwaredifferences.ItemploysvariouscollectorslikeSerial,Parallel,CMS,andG1,eachsuitedfordifferentscenarios.Performancecanbetunedwithflagslike-XX:NewRa

Java代碼可以在不同操作系統上無需修改即可運行,這是因為Java的“一次編寫,到處運行”哲學,由Java虛擬機(JVM)實現。 JVM作為編譯後的Java字節碼與操作系統之間的中介,將字節碼翻譯成特定機器指令,確保程序在任何安裝了JVM的平台上都能獨立運行。

Java程序的編譯和執行通過字節碼和JVM實現平台獨立性。 1)編寫Java源碼並編譯成字節碼。 2)使用JVM在任何平台上執行字節碼,確保代碼的跨平台運行。

Java性能与硬件架构密切相关,理解这种关系可以显著提升编程能力。1)JVM通过JIT编译将Java字节码转换为机器指令,受CPU架构影响。2)内存管理和垃圾回收受RAM和内存总线速度影响。3)缓存和分支预测优化Java代码执行。4)多线程和并行处理在多核系统上提升性能。

使用原生庫會破壞Java的平台獨立性,因為這些庫需要為每個操作系統單獨編譯。 1)原生庫通過JNI與Java交互,提供Java無法直接實現的功能。 2)使用原生庫增加了項目複雜性,需要為不同平台管理庫文件。 3)雖然原生庫能提高性能,但應謹慎使用並進行跨平台測試。

JVM通過JavaNativeInterface(JNI)和Java標準庫處理操作系統API差異:1.JNI允許Java代碼調用本地代碼,直接與操作系統API交互。 2.Java標準庫提供統一API,內部映射到不同操作系統API,確保代碼跨平台運行。

modularitydoesnotdirectlyaffectJava'splatformindependence.Java'splatformindependenceismaintainedbytheJVM,butmodularityinfluencesapplicationstructureandmanagement,indirectlyimpactingplatformindependence.1)Deploymentanddistributionbecomemoreefficientwi

BytecodeinJavaistheintermediaterepresentationthatenablesplatformindependence.1)Javacodeiscompiledintobytecodestoredin.classfiles.2)TheJVMinterpretsorcompilesthisbytecodeintomachinecodeatruntime,allowingthesamebytecodetorunonanydevicewithaJVM,thusfulf


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1
強大的PHP整合開發環境

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3漢化版
中文版,非常好用

Atom編輯器mac版下載
最受歡迎的的開源編輯器