1. ???? ????? ??
??? ??? ???? ???? ??? ?? ????? ???.
??? ???? ??? ???? ????? ?? ?????? ???.
?? ????? ? ?? ?? ??? ????.
1) ??? ??? ???? ????? ??? ???? ?? ???? ????? ?????.
2) ???? ???? ?? ??? ???? ?????. .
?? ?? ?????? ?? ??? ??? ??? ?? ??? ?? ???? ???? ??? ??? ? ??? ????? ???. ?? ??, ?? ???? ?? ? ??? ?? ?????. 100,000?? ???? ??? ????? 100,000?? ?? ??? ?? ? ??? ?? ???? ?? ?? ? ???? ? ????? ?? ??? ??? ??????. disk? ?? ???? ??? ????? ?????? ??? ??? ???? ???? ???.
? ????? ???? ??? ? ?? ??? ??? ???? ?? ? ????. ?? ??? ????? ???? ??? ??? ????? ?? ?????. ???? ? Java ??? ????? ?? ???? ?? ??? ???? ???? ???. ???? ??? ???? Java ??? ???? ???.
2. JDK ??? ?????? ??? API
java.io.ObjectOutputStream? ?? ?? ???? ?????. ?? writeObject(Object obj) ???? ????? ??? obj ??? ????? A ???? ??? ? ????. ???? ?? ?? ???? ?????.
java.io.ObjectInputStream? ?? ?? ???? ?????. readObject() ???? ?? ?? ????? ??? ???? ?? ?? ??? ????? ? ?????.
??? ?? ? ??? ?? ?????? ???? ???? ??? ???? ? ????. ??? ?? ?????? ???? ?????.
??? ?? ?????, ??? ?? ?????? ???? ???? ????? ??? ??? ??? ???? ????, ??? ?? ?????? ???? ????
?? ??? ??? ?????.
?? ????? ?? ??? ?????.
1) ?? ?? ???? ?? ?? ??? ?? ?? ???? ??? ? ?? ?? ?? ???? ?????.
2) ??? writeObject() ???? ?? ??? ???. ?? ???.
?? ???? ??? ??? ????.
1) ?? ?? ???? ?? ?? ??? ?? ?? ???? ??? ? ?? ?? ?? ???? ?????.
2) readObject() ???? ?? ??? ????. ?? ?? ???? .
?? ??? ? ???? ?:
Person ??? ?? ? ??? ?? ????? ??
import java.io.Serializable; /** * <p>ClassName: Person<p> * <p>Description:測試對象序列化和反序列化<p> * @author xudp * @version 1.0 V * @createTime 2014-6-9 下午02:33:25 */ public class Person implements Serializable { /** * 序列化ID */ private static final long serialVersionUID = -5809782578272943999L; private int age; private String name; private String sex; public int getAge() { return age; } public String getName() { return name; } public String getSex() { return sex; } public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } }
Person ??? ??? ??? ? ????
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.text.MessageFormat; /** * <p>ClassName: TestObjSerializeAndDeserialize<p> * <p>Description: 測試對象的序列化和反序列<p> * @author xudp * @version 1.0 V * @createTime 2014-6-9 下午03:17:25 */ public class TestObjSerializeAndDeserialize { public static void main(String[] args) throws Exception { SerializePerson();//序列化Person對象 Person p = DeserializePerson();//反序列Perons對象 System.out.println(MessageFormat.format("name={0},age={1},sex={2}", p.getName(), p.getAge(), p.getSex())); } /** * MethodName: SerializePerson * Description: 序列化Person對象 * @author xudp * @throws FileNotFoundException * @throws IOException */ private static void SerializePerson() throws FileNotFoundException, IOException { Person person = new Person(); person.setName("gacl"); person.setAge(25); person.setSex("男"); // ObjectOutputStream 對象輸出流,將Person對象存儲到E盤的Person.txt文件中,完成對Person對象的序列化操作 ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream( new File("E:/Person.txt"))); oo.writeObject(person); System.out.println("Person對象序列化成功!"); oo.close(); } /** * MethodName: DeserializePerson * Description: 反序列Perons對象 * @author xudp * @return * @throws Exception * @throws IOException */ private static Person DeserializePerson() throws Exception, IOException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream( new File("E:/Person.txt"))); Person person = (Person) ois.readObject(); System.out.println("Person對象反序列化成功!"); return person; } }
?? ?? ??? ??? ????.
Person? ????? ???? ? E ????? Person.txt ??? ????, Person? ?????? E
3 ?????? Person.txt? ?? ? Person ??? ?????. serialVersionUID
serialVersionUID: ? ??? ??? ?? ??? ?????. ??? ?? ?????? ???? ?? ????? ??? ?? ?? ???? ???? ?? ??? ????.
private static final long serialVersionUID
??? ?? ?????? ???? ???? ???? serialVersionUID? ???? ??? ??? ?? ?? ???? ?????.
???? ???? ?? ??? ?? serialVersionUID ??? ?? ?? ??? ?????.
serialVersionUID? ???? ???? ? ??? ????.
?? ? ???? ??? serialVersionUID? 1L???. ?:
private static final long serialVersionUID = 1L;
? ???? ??? serialVersionUID? ??? ??, ????? ??, ??? ? ?? ?? ???? ?????. ?:
private static final long serialVersionUID = 4603642343377807741L;
??? ? ??? ??? ?? ?? ???? ?????.
??? serialVersionUID(???? ?? ??)? ??? ?????? ?? ?? ???? serialVersionUID? ??? ?????. ?? ????:
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class TestSerialversionUID { public static void main(String[] args) throws Exception { SerializeCustomer();// 序列化Customer對象 Customer customer = DeserializeCustomer();// 反序列Customer對象 System.out.println(customer); } /** * MethodName: SerializeCustomer * Description: 序列化Customer對象 * @author xudp * @throws FileNotFoundException * @throws IOException */ private static void SerializeCustomer() throws FileNotFoundException, IOException { Customer customer = new Customer("gacl",25); // ObjectOutputStream 對象輸出流 ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream( new File("E:/Customer.txt"))); oo.writeObject(customer); System.out.println("Customer對象序列化成功!"); oo.close(); } /** * MethodName: DeserializeCustomer * Description: 反序列Customer對象 * @author xudp * @return * @throws Exception * @throws IOException */ private static Customer DeserializeCustomer() throws Exception, IOException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream( new File("E:/Customer.txt"))); Customer customer = (Customer) ois.readObject(); System.out.println("Customer對象反序列化成功!"); return customer; } } /** * <p>ClassName: Customer<p> * <p>Description: Customer實現(xiàn)了Serializable接口,可以被序列化<p> * @author xudp * @version 1.0 V * @createTime 2014-6-9 下午04:20:17 */ class Customer implements Serializable { //Customer類中沒有定義serialVersionUID private String name; private int age; public Customer(String name, int age) { this.name = name; this.age = age; } /* * @MethodName toString * @Description 重寫Object類的toString()方法 * @author xudp * @return string * @see java.lang.Object#toString() */ @Override public String toString() { return "name=" + name + ", age=" + age; } }
?? ??:
序列化和反序列化都成功了。
下面我們修改一下Customer類,添加多一個sex屬性,如下:
class Customer implements Serializable { //Customer類中沒有定義serialVersionUID private String name; private int age; //新添加的sex屬性 private String sex; public Customer(String name, int age) { this.name = name; this.age = age; } public Customer(String name, int age,String sex) { this.name = name; this.age = age; this.sex = sex; } /* * @MethodName toString * @Description 重寫Object類的toString()方法 * @author xudp * @return string * @see java.lang.Object#toString() */ @Override public String toString() { return "name=" + name + ", age=" + age; } }
然后執(zhí)行反序列操作,此時就會拋出如下的異常信息:
1 Exception in thread "main" java.io.InvalidClassException: Customer; 2 local class incompatible: 3 stream classdesc serialVersionUID = -88175599799432325, 4 local class serialVersionUID = -5182532647273106745
意思就是說,文件流中的class和classpath中的class,也就是修改過后的class,不兼容了,處于安全機制考慮,程序拋出了錯誤,并且拒絕載入。那么如果我們真的有需求要在序列化后添加一個字段或者方法呢?應(yīng)該怎么辦?那就是自己去指定serialVersionUID。在TestSerialversionUID例子中,沒有指定Customer類的serialVersionUID的,那么java編譯器會自動給這個class進行一個摘要算法,類似于指紋算法,只要這個文件 多一個空格,得到的UID就會截然不同的,可以保證在這么多類中,這個編號是唯一的。所以,添加了一個字段后,由于沒有顯指定 serialVersionUID,編譯器又為我們生成了一個UID,當然和前面保存在文件中的那個不會一樣了,于是就出現(xiàn)了2個序列化版本號不一致的錯誤。因此,只要我們自己指定了serialVersionUID,就可以在序列化后,去添加一個字段,或者方法,而不會影響到后期的還原,還原后的對象照樣可以使用,而且還多了方法或者屬性可以用。
下面繼續(xù)修改Customer類,給Customer指定一個serialVersionUID,修改后的代碼如下:
class Customer implements Serializable { /** * Customer類中定義的serialVersionUID(序列化版本號) */ private static final long serialVersionUID = -5182532647273106745L; private String name; private int age; //新添加的sex屬性 //private String sex; public Customer(String name, int age) { this.name = name; this.age = age; } /*public Customer(String name, int age,String sex) { this.name = name; this.age = age; this.sex = sex; }*/ /* * @MethodName toString * @Description 重寫Object類的toString()方法 * @author xudp * @return string * @see java.lang.Object#toString() */ @Override public String toString() { return "name=" + name + ", age=" + age; } }
重新執(zhí)行序列化操作,將Customer對象序列化到本地硬盤的Customer.txt文件存儲,然后修改Customer類,添加sex屬性,修改后的Customer類代碼如下:
class Customer implements Serializable { /** * Customer類中定義的serialVersionUID(序列化版本號) */ private static final long serialVersionUID = -5182532647273106745L; private String name; private int age; //新添加的sex屬性 private String sex; public Customer(String name, int age) { this.name = name; this.age = age; } public Customer(String name, int age,String sex) { this.name = name; this.age = age; this.sex = sex; } /* * @MethodName toString * @Description 重寫Object類的toString()方法 * @author xudp * @return string * @see java.lang.Object#toString() */ @Override public String toString() { return "name=" + name + ", age=" + age; } }
執(zhí)行反序列操作,這次就可以反序列成功了,如下所示:
四、serialVersionUID的取值
serialVersionUID的取值是Java運行時環(huán)境根據(jù)類的內(nèi)部細節(jié)自動生成的。如果對類的源代碼作了修改,再重新編譯,新生成的類文件的serialVersionUID的取值有可能也會發(fā)生變化。
類的serialVersionUID的默認值完全依賴于Java編譯器的實現(xiàn),對于同一個類,用不同的Java編譯器編譯,有可能會導(dǎo)致不同的 serialVersionUID,也有可能相同。為了提高serialVersionUID的獨立性和確定性,強烈建議在一個可序列化類中顯示的定義serialVersionUID,為它賦予明確的值。
顯式地定義serialVersionUID有兩種用途:
1、 在某些場合,希望類的不同版本對序列化兼容,因此需要確保類的不同版本具有相同的serialVersionUID;
2、 在某些場合,不希望類的不同版本對序列化兼容,因此需要確保類的不同版本具有不同的serialVersionUID。
推薦學(xué)習:Java視頻教程
? ??? Java ??? ??? ? ????? ?? ???? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

Java ?? ???? ?? ??? ?????. ??? ??: ???? ???? ??? ?????. ??? ??: ? ???? ??? ?? ??? ??? ?????. ?????: ??? ??? ??? ??? ? ????? ?????. ???: ??? ???? ??? ????? ??????. ??? ??: ??? ??? ??? ????? ?? ??? ???? ?????.

PHP ??? ?? ??: ??? ? ???? ??? ???? ??? ??? ? ????? ???? ?? ??? ? ????? ??? ???? ????? ???? ??? ?? ?? ? ?????. PHP??? serialize() ? unserialize() ??? ???? ??? ??? ? ???? ??? ??? ? ????. ? ???? ? ? ?? ??? ???? ??? ??? ???? ?? ?? ??? ?????. 1. ??? ??????? ???? ????? ??????

PHP ???? ??? ?? ?? ?? ???? ???? ??????. ??? ?? ??, ?? ?? ??, PHP ?? ????, ?? ?? ?? ?? ?????. ??? ??: 1. ???? ???? ??????. ?? ???? ???? ???? PHP? ??? ??? ????? ??????. ???? ?????? ??? ??? ?? ??? ????? ???? ??? ???? ??? ? ????. 2. ??? ??? ???? ???? ???? ??? ?? ???? ???? ???? ??? ? ??? ??????. ???? ???? ??? ???? ? ?? ?? ??? ?? ?? ??? ? ? ????.

Flexjson? Java ??? JSON ???? ??? ? ?????? ?? ?? ????????. JSONSerializer ???? serialize() ???? ???? ?? ??? ???? ? ????. ? ???? ?? ?????? ?? ???? ?????. ?? ??? ?? ??? ????? serialize() ???? ???? ???. ?? publicStringserialize(Objecttarget) ? importflexjson.JSONSerializer;importjava.util.*;publicclassJsonSerial

C++ ????? ??? ? ???? ??? ???: ?? ???? ???? ?? ???? ???? ?????. ??? ????? ??????. ????: ?? ???? ???? ?? ???? ???? ?????. ?????? ??? ???????. ?? ?: ???: ?? ??? ??. ???? ??? ?????. ??? ???? ????? ??????. ????: ?? ???? ?????. ???? ??? ?????. ??? ???? ?????? ???????.

MyBatis? Java ???????? ??????? ?? ???? ????? ????? ?? ???? ?? ????? ??? ??? ?? ????????. MyBatis ?????? ?? ????? SQL ?? Java ??? ????, XML ?? ???? ??? ?? SQL ??? ???? ?????? ??? ?? ??? ? ??? ?? ????. MyBatis?? SQL? Java ??? ???? ????? ??? ? ??? ?? ? ????. SQL ?? ?? ??, Java ?? ?? ?

@JsonPropertyOrder? ??? ???? ???? ?????. ?? ??? JSON ???? ??? ???? ??? ???? ??? ???? ?? ??? ???? ?????. ?? ??? ??? ??? ??? ???? ?? ????? ??? ???? ?? ??? ? ?? ???? ? ????. ?? public@interfaceJsonPropertyOrder ? importcom.fasterxml.jackson.core.*;importcom.fasterxml.jackson.databind.*;importcom.fasterxml.jac

???? Java ??? ??? ??: ??? ????? ??? ? ??? ??? ????? ?????. ????? ?? ???? ???? ?? ??? ??? ??? ????? ??? ?? ? ?? ??? ?????. ? ??? ????? ?? ???? ??? ?????. ???? ??? ????? ?? ??? ? ??? ??????.
