java 第三方序列化,11.既然有第三方的序列化方式,说明java官方提供的序列化方式应该有一些很明显或者很致命的缺点……...
序列化是什么:把一個(gè)java對(duì)象轉(zhuǎn)化為二進(jìn)制對(duì)象,并保存到硬盤,或在網(wǎng)絡(luò)上傳輸。反序列化就是把序列化的二進(jìn)制對(duì)象讀到內(nèi)存中。 作用:
1、減少內(nèi)存占用或網(wǎng)絡(luò)傳輸。比如web容器中的session,當(dāng)session數(shù)量過(guò)大比如10W+連接時(shí)會(huì)將一部分session序列化到硬盤,需要時(shí)再讀取。
2、當(dāng)兩個(gè)遠(yuǎn)程進(jìn)程通信,可以將對(duì)象序列化后傳給另外的進(jìn)程,另外的進(jìn)程再反序列化獲取對(duì)象值。
代碼示例:
Person類 實(shí)現(xiàn) Serializable 接口 `package com.seriable;
import java.io.Serializable;
/**
Desc:
@author: lisha 2018/7/25 14:29 */ 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; } }`
測(cè)試類測(cè)試序列化
`public class MainTest {
public static void main(String[] args) throws Exception {
// 序列化Person對(duì)象
SerializePerson();
// 反序列Perons對(duì)象
// Person p = DeserializePerson(); // System.out.println(MessageFormat.format("name={0},age={1},sex={2}", // p.getName(), p.getAge(), p.getSex())); }
/**
* MethodName: SerializePerson
* Description: 序列化Person對(duì)象
* [@author](https://my.oschina.net/arthor) xudp
* [@throws](https://my.oschina.net/throws) FileNotFoundException
* [@throws](https://my.oschina.net/throws) IOException
*/
private static void SerializePerson() throws FileNotFoundException,
IOException {
Person person = new Person();
person.setName("ls");
person.setAge(28);
person.setSex("男");
// ObjectOutputStream 對(duì)象輸出流,將Person對(duì)象存儲(chǔ)到E盤的Person.txt文件中,完成對(duì)Person對(duì)象的序列化操作
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
new File("E:/Person.txt")));
oo.writeObject(person);
System.out.println("Person對(duì)象序列化成功!");
oo.close();
}
/**
* MethodName: DeserializePerson
* Description: 反序列Perons對(duì)象
* [@author](https://my.oschina.net/arthor) 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對(duì)象反序列化成功!");
return person;
}
}`
生成txt文件
反序列化是一樣的,將txt文件讀到j(luò)ava對(duì)象中 serialVersionUID 這個(gè)在Person中是序列化id,用來(lái)匹配校驗(yàn)序列化的對(duì)象和反序列化生成的對(duì)象必須是同一個(gè)對(duì)象。 /** * 序列化ID */ //private static final long serialVersionUID = -5809782578272943999L;
JDK自帶序列化注意事項(xiàng)
1、如果子類實(shí)現(xiàn)Serializable接口而父類未實(shí)現(xiàn)時(shí),父類不會(huì)被序列化,但此時(shí)父類必須有個(gè)無(wú)參構(gòu)造方法,否則會(huì)拋InvalidClassException異常。
2、靜態(tài)變量不會(huì)被序列化,那是類的“菜”,不是對(duì)象的。
3、transient關(guān)鍵字修飾變量可以限制序列化。
4、虛擬機(jī)是否允許反序列化,不僅取決于類路徑和功能代碼是否一致,一個(gè)非常重要的一點(diǎn)是兩個(gè)類的序列化 ID 是否一致,就是 private static final long serialVersionUID = 1L。
5、Java 序列化機(jī)制為了節(jié)省磁盤空間,具有特定的存儲(chǔ)規(guī)則,當(dāng)寫入文件的為同一對(duì)象時(shí),并不會(huì)再將對(duì)象的內(nèi)容進(jìn)行存儲(chǔ),而只是再次存儲(chǔ)一份引用。反序列化時(shí),恢復(fù)引用關(guān)系。
6、序列化到同一個(gè)文件時(shí),如第二次修改了相同對(duì)象屬性值再次保存時(shí)候,虛擬機(jī)根據(jù)引用關(guān)系知道已經(jīng)有一個(gè)相同對(duì)象已經(jīng)寫入文件,因此只保存第二次寫的引用,所以讀取時(shí),都是第一次保存的對(duì)象。讀者在使用一個(gè)文件多次 writeObject 需要特別注意這個(gè)問(wèn)題(基于第5點(diǎn))。
總結(jié)
以上是生活随笔為你收集整理的java 第三方序列化,11.既然有第三方的序列化方式,说明java官方提供的序列化方式应该有一些很明显或者很致命的缺点……...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 感恩父母的暖心话语有哪些 有什么感恩父母
- 下一篇: 年终奖纳税方式变了有什么影响 年终奖纳税