java序列化與反序列化_第1頁(yè)
java序列化與反序列化_第2頁(yè)
java序列化與反序列化_第3頁(yè)
java序列化與反序列化_第4頁(yè)
java序列化與反序列化_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、java序列化與反序列化一、什么是序列化?序列化是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化??梢詫?duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是一種將Java對(duì)象的狀態(tài)轉(zhuǎn)換為字節(jié)數(shù)組,以便存儲(chǔ)或傳輸?shù)臋C(jī)制,以后,仍可以將字節(jié)數(shù)組轉(zhuǎn)換回Java對(duì)象原有的狀態(tài)。序列化的思想是 “凍結(jié)” 對(duì)象狀態(tài),傳輸對(duì)象狀態(tài)(寫到磁盤、通過(guò)網(wǎng)絡(luò)傳輸?shù)鹊?,然后“解凍”狀態(tài),重新獲得可用的Java對(duì)象。所有這些事情的發(fā)生有點(diǎn)像是魔術(shù),這要?dú)w功于ObjectInputStream/ObjectOutputStream類、完全保真的元數(shù)據(jù),以及程序員愿意用Serializab

2、le標(biāo)識(shí)接口標(biāo)記他們的類,從而 “參與” 這個(gè)過(guò)程。把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化。把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化。二、為什么要序列化?什么情況下需要序列化?當(dāng)兩個(gè)進(jìn)程在進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類型的數(shù)據(jù)。無(wú)論是何種類型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個(gè)對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送,接收方則需要把字節(jié)序列再恢復(fù)為對(duì)象。對(duì)象序列化可以實(shí)現(xiàn)分布式對(duì)象。主要應(yīng)用例如:RMI要利用對(duì)象序列化運(yùn)行遠(yuǎn)程主機(jī)上的服務(wù),就像在本地機(jī)上運(yùn)行對(duì)象時(shí)一樣。 java對(duì)象序列化不僅保留一個(gè)對(duì)象的數(shù)據(jù),而且遞歸保存對(duì)象引用的每個(gè)對(duì)象的數(shù)據(jù)??梢詫⒄麄€(gè)對(duì)

3、象層次寫入字節(jié)流中,可以保存在文件中或在網(wǎng)絡(luò)連接上傳遞。利用對(duì)象序列化可以進(jìn)行對(duì)象的"深復(fù)制",即復(fù)制對(duì)象本身及引用的對(duì)象本身。序列化一個(gè)對(duì)象可能得到整個(gè)對(duì)象序列。序列化能將對(duì)象轉(zhuǎn)成如XML/Bit流,方便對(duì)象的磁盤存儲(chǔ)、網(wǎng)絡(luò)傳輸(webService,RMI)。對(duì)象的壽命常隨著生成該對(duì)象的程序的終止而終止。有時(shí)候,可能需要將對(duì)象的狀態(tài)保存下來(lái),在需要時(shí)再將對(duì)象恢復(fù)以延續(xù)其狀態(tài)。如何做到程序終止后對(duì)象繼續(xù)存在? 如何將對(duì)象在網(wǎng)絡(luò)上傳輸? 三、相關(guān)接口和類(1)Serializable接口和Externalizable接口(2)ObjectOutput接口:它繼承DataOu

4、tput接口并且支持對(duì)象的序列化,其內(nèi)的writeObject()方法實(shí)現(xiàn)存儲(chǔ)一個(gè)對(duì)象。(3)ObjectOutputStream類:它繼承OutputStream類并且實(shí)現(xiàn)ObjectOutput接口。利用該類來(lái)實(shí)現(xiàn)將對(duì)象存儲(chǔ)(調(diào)用ObjectOutput接口中的writeObject()方法)。(4)ObjectInput接口:它繼承DataInput接口并且支持對(duì)象的序列化,其內(nèi)的readObject()方法實(shí)現(xiàn)讀取一個(gè)對(duì)象。(5)ObjectInputStream類:它繼承InputStream類并且實(shí)現(xiàn)ObjectInput接口。利用該類來(lái)實(shí)現(xiàn)將對(duì)象存儲(chǔ)(調(diào)用ObjectInput接

5、口中的readObject()方法)。四、怎么實(shí)現(xiàn)序列化?要被序列化的類必須實(shí)現(xiàn)Serializable接口或者Externalizable接口之一。1. 實(shí)現(xiàn)Serializable接口,不需要實(shí)現(xiàn)任何方法,只是一個(gè)標(biāo)記接口。package com.test.ser;import java.io.Serializable;public class Person implements Serializable/* * serial version id */private static final long serialVersionUID = -2858407989098901728L;pu

6、blic Person(String name,int age) = name;this.age = age;private String name;private int age;public String getName() return name;public void setName(String name) = name;public int getAge() return age;public void setAge(int age) this.age = age;public String toString()return "Per

7、son:name="+name+"age="+age+""2. 使用java.io.ObjectOutputStream類的writeObject()方法,將對(duì)象保存到磁盤文件,文件后綴名可以任意起。使用java.io.ObjectInputStream類的readObject()方法,將對(duì)象反序列化為原始對(duì)象。如果同時(shí)序列化多個(gè)對(duì)象到一個(gè)序列化文件時(shí),讀取的順序應(yīng)與寫入的順序保持一致。package com.test.ser;import java.io.FileInputStream;import java.io.FileNotFoundE

8、xception;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class SerTest public static void main(String args) /可序列化基本類型、普通

9、對(duì)象為文件 Person p1 = new Person("張三",24);Person p2 = new Person("李四",25);/也可序列化容器對(duì)象為文件 List<Person> ps = new ArrayList<Person>();ps.add(p1);ps.add(p2);/也可序列化復(fù)雜容器對(duì)象為文件 Map<String,List<Person>> map = new HashMap<String,List<Person>>();map.put("

10、m", ps);/序列化到磁盤文件try FileOutputStream fos = new FileOutputStream("tempdata.ser");/文件輸出流ObjectOutputStream oos = new ObjectOutputStream(fos); /也可使用其他輸出流構(gòu)造ObjectOutputStream,如ByteArrayOutputStream等oos.writeObject(ps);/寫入第一個(gè)對(duì)象oos.writeObject(1111);/寫入第二個(gè)對(duì)象fos.close();oos.close(); catch (

11、FileNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/從文件反序列化為原始對(duì)象try FileInputStream fis = new FileInputStream("tempdata.ser");ObjectInputStream ois = new ObjectInputStream(fis);SuppressWa

12、rnings("unchecked")List<Person> plist = (List<Person>)ois.readObject();/讀取第一個(gè)對(duì)象,讀取的順序應(yīng)與寫入的順序保持一致for(Person p:plist)System.out.println("name:"+p.getName()+" age:"+p.getAge();Integer i = (Integer)ois.readObject();/讀取第二個(gè)對(duì)象System.out.println(Value();/new Fi

13、le("tempdata.ser").delete(); catch (FileNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace();五、序列化的特性?1.什么

14、被序列化屬性(包括基本數(shù)據(jù)類型、數(shù)組、對(duì)其它對(duì)象的引用(深度復(fù)制))類名2.什么不被序列化static的屬性方法加了transient修飾符的屬性3.序列化特點(diǎn)(1)如果某個(gè)類能夠被序列化,其子類也可以被序列化。(2)聲明為static和transient類型的成員數(shù)據(jù)不能被序列化。因?yàn)閟tatic代表類的狀態(tài),不是對(duì)象的狀態(tài),transient代表對(duì)象的臨時(shí)數(shù)據(jù)。(3)屬性中對(duì)其他類對(duì)象的引用時(shí),引用的類也必須實(shí)現(xiàn)序列化,因?yàn)樾蛄谢巧疃刃蛄谢绻淮_定引用類是否實(shí)現(xiàn)了序列化接口,則最好聲明此引用屬性不被序列化。(4)一個(gè)子類實(shí)現(xiàn)了 Serializable 接口,它的父類都沒(méi)有實(shí)現(xiàn) Se

15、rializable 接口,序列化該子類對(duì)象,然后反序列化后輸出父類定義的某變量的數(shù)值,該變量數(shù)值與序列化時(shí)的數(shù)值不同。只有當(dāng)父類也實(shí)現(xiàn)Serializable接口時(shí),父類對(duì)象才會(huì)被序列化(先有父對(duì)象,才有子對(duì)象),如果父類沒(méi)實(shí)現(xiàn)序列化,那么父類對(duì)象不會(huì)被序列化,當(dāng)被反序列化時(shí),會(huì)自動(dòng)調(diào)用其無(wú)參構(gòu)造函數(shù)來(lái)構(gòu)造父類對(duì)象,所以如果父類沒(méi)有實(shí)現(xiàn)Serializable接口,就必須有無(wú)參的構(gòu)造方法。要想將父類對(duì)象也序列化,就需要讓父類也實(shí)現(xiàn)Serializable 接口。如果父類不實(shí)現(xiàn)的話的,就 需要有默認(rèn)的無(wú)參的構(gòu)造函數(shù)。在父類沒(méi)有實(shí)現(xiàn) Serializable 接口時(shí),虛擬機(jī)是不會(huì)序列化父對(duì)象的,

16、而一個(gè) Java 對(duì)象的構(gòu)造必須先有父對(duì)象,才有子對(duì)象,反序列化也不例外。所以反序列化時(shí),為了構(gòu)造父對(duì)象,只能調(diào)用父類的無(wú)參構(gòu)造函數(shù)作為默認(rèn)的父對(duì)象。因此當(dāng)我們?nèi)「笇?duì)象的變量值時(shí),它的值是調(diào)用父類無(wú)參構(gòu)造函數(shù)后的值。如果你考慮到這種序列化的情況,在父類無(wú)參構(gòu)造函數(shù)中對(duì)變量進(jìn)行初始化,否則的話,父類變量值都是默認(rèn)聲明的值,如 int 型的默認(rèn)是 0,string 型的默認(rèn)是 null。(5)序列化接口產(chǎn)生的序列化ID:在分布式應(yīng)用中,如果需要將對(duì)象通過(guò)序列化進(jìn)行傳輸,那么就有一個(gè)問(wèn)題,那就是一端進(jìn)行序列化,另一端就必須反序列化,那么是不是兩個(gè)類的代碼一摸一樣就一定能強(qiáng)制轉(zhuǎn)換成功呢,其實(shí)不是的,序

17、列化類有個(gè)序列化ID,兩個(gè)類完全相同,除了代碼相同,同時(shí)這個(gè)ID也需要相同,那么強(qiáng)制轉(zhuǎn)換就成功了。(6)序列化存儲(chǔ)規(guī)則看下面代碼: ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj");Test test = new Test();/試圖將對(duì)象兩次寫入文件out.writeObject(test);out.flush();System.out.println(new File("result.obj").length();out.writeOb

18、ject(test);out.close();System.out.println(new File("result.obj").length();ObjectInputStream oin = new ObjectInputStream(new FileInputStream("result.obj");/從文件依次讀出兩個(gè)文件Test t1 = (Test) oin.readObject();Test t2 = (Test) oin.readObject();oin.close();/判斷兩個(gè)引用是否指向同一個(gè)對(duì)象System.out.println

19、(t1 = t2);對(duì)同一對(duì)象兩次寫入文件,打印出寫入一次對(duì)象后的存儲(chǔ)大小和寫入兩次后的存儲(chǔ)大小,然后從文件中反序列化出兩個(gè)對(duì)象,比較這兩個(gè)對(duì)象是否為同一對(duì)象。一般的思維是,兩次寫入對(duì)象,文件大小會(huì)變?yōu)閮杀兜拇笮?,反序列化時(shí),由于從文件讀取,生成了兩個(gè)對(duì)象,判斷相等時(shí)應(yīng)該是輸入 false 才對(duì),但是最后結(jié)果輸出序列化文件只增加了5b(字節(jié)),而且比較結(jié)果為true,兩個(gè)對(duì)象是相等的,這是因?yàn)镴ava 序列化機(jī)制為了節(jié)省磁盤空間,具有特定的存儲(chǔ)規(guī)則,當(dāng)寫入文件的為同一對(duì)象時(shí),并不會(huì)再將對(duì)象的內(nèi)容進(jìn)行存儲(chǔ),而只是再次存儲(chǔ)一份引用,上面增加的 5 字節(jié)的存儲(chǔ)空間就是新增引用和一些控制信息的空間。反

20、序列化時(shí),恢復(fù)引用關(guān)系,使得清單 3 中的 t1 和 t2 指向唯一的對(duì)象,二者相等,輸出 true。該存儲(chǔ)規(guī)則極大的節(jié)省了存儲(chǔ)空間。再看下面代碼:ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj");Test test = new Test();test.i = 1;out.writeObject(test);out.flush();test.i = 2;out.writeObject(test);out.close();ObjectInputStream oi

21、n = new ObjectInputStream(new FileInputStream("result.obj");Test t1 = (Test) oin.readObject();Test t2 = (Test) oin.readObject();System.out.println(t1.i);System.out.printlni);上述代碼的目的是希望將 test 對(duì)象兩次保存到 result.obj 文件中,寫入一次以后修改對(duì)象屬性值再次保存第二次,然后從 result.obj 中再依次讀出兩個(gè)對(duì)象,輸出這兩個(gè)對(duì)象的 i 屬性值。案例代碼的目的原本是希望一次

22、性傳輸對(duì)象修改前后的狀態(tài)。結(jié)果兩個(gè)輸出的都是 1, 原因就是第一次寫入對(duì)象以后,第二次再試圖寫的時(shí)候,虛擬機(jī)根據(jù)引用關(guān)系知道已經(jīng)有一個(gè)相同對(duì)象已經(jīng)寫入文件,因此只保存第二次寫的引用,所以讀取時(shí),都是第一次保存的對(duì)象。在使用一個(gè)文件多次 writeObject 需要特別注意這個(gè)問(wèn)題。(7)當(dāng)要序列化的類也重寫了writeReplace和readResolve方法時(shí),writeReplace會(huì)在writeObject前執(zhí)行,readResolve會(huì)在readObject后執(zhí)行。writeReplace invokedwriteObject(External) invokedreadObject(E

23、xternal) invokedreadResolve invoked首先JVM會(huì)先調(diào)用writeReplace方法,在這個(gè)階段,我們可以進(jìn)行張冠李戴,將需要進(jìn)行序列化的對(duì)象換成我們指定的對(duì)象.跟著JVM將調(diào)用writeObject方法,來(lái)將對(duì)象中的屬性一個(gè)個(gè)進(jìn)行序列化,我們可以在這個(gè)方法中控制住哪些屬性需要序列化.當(dāng)反序列化的時(shí)候:JVM會(huì)調(diào)用readObject方法,將我們剛剛在writeObject方法序列化好的屬性,反序列化回來(lái).然后在readResolve方法中,我們也可以指定JVM返回我們特定的對(duì)象(不是剛剛序列化回來(lái)的對(duì)象).注意到在writeReplace和readResolv

24、e,我們可以嚴(yán)格控制singleton的對(duì)象,在同一個(gè)JVM中完完全全只有唯一的對(duì)象,控制不讓singleton對(duì)象產(chǎn)生副本.六、類的某個(gè)屬性(如密碼)不想被暴露或不想被序列化怎么辦?1. 定制對(duì)象序列化,重寫writeObject和readObject方法,對(duì)某些屬性進(jìn)行處理,如加密、簽名等。package com.test.ser2;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public c

25、lass Person implements Serializable/* * serial version id */private static final long serialVersionUID = -2858407989098901728L;public Person(String name,int age,String psw) = name;this.age = age;this.pwd = psw;private String name;private int age;private String pwd;public String getName() re

26、turn name;public void setName(String name) = name;public int getAge() return age;public void setAge(int age) this.age = age;public String getPwd() return pwd;public void setPwd(String pwd) this.pwd = pwd;public String toString()return "Person:name="+name+"age="+age+&quo

27、t;"/當(dāng)這個(gè)類被序列化時(shí)writeObject被自動(dòng)調(diào)用,不用顯示調(diào)用,所以聲明為privateprivate void writeObject(ObjectOutputStream out)String password = encrypt(pwd);/密碼被加密處理,然后再序列化try out.writeObject(name);out.writeInt(age);out.writeObject(password); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/readO

28、bject被自動(dòng)調(diào)用,不用顯示調(diào)用,所以聲明為privateprivate void readObject(ObjectInputStream in)try = (String)in.readObject();this.age = in.readInt();this.pwd = new StringBuilder(String)in.readObject().reverse().toString();/解密 catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (C

29、lassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace();public String encrypt(String psw)return new StringBuilder(psw).reverse().toString();2.使用transient關(guān)鍵字,(transient是“臨時(shí)的”),如下:可使pwd屬性不被序列化。private transient String pwd;Transient 關(guān)鍵字的作用是控制變量的序列化,在變量聲明前加上該關(guān)鍵字,可以阻止該變量被序列化到文件中,在被反

30、序列化后,transient 變量的值被設(shè)為初始值,如 int 型的是 0,對(duì)象型的是 null。3.實(shí)現(xiàn)Externalizable接口參見(jiàn)七。七、Externalizable(外部化)怎么用?Externalizable接口表示實(shí)現(xiàn)該接口的類在序列化中由該類本身來(lái)控制信息的寫出和讀入。(1)實(shí)現(xiàn)Externalizable接口(2)實(shí)現(xiàn)readExternal()/writeExternal()方法,定義要序列化的屬性(3)需要一個(gè)不帶參數(shù)的構(gòu)造器(是否需要顯式定義根據(jù)類是否有定義其他構(gòu)造器而定)package com.test.ser3;import java.io.Externaliz

31、able;import java.io.IOException;import java.io.ObjectInput;import java.io.ObjectOutput;public class Person implements Externalizable/* * serial version id */private static final long serialVersionUID = -2858407989098901728L;/使用Externalizable時(shí),必須有一個(gè)無(wú)參構(gòu)造器public Person()public Person(String name,int ag

32、e,String psw) = name;this.age = age;this.pwd = psw;private String name;private int age;private String pwd;public String getName() return name;public void setName(String name) = name;public int getAge() return age;public void setAge(int age) this.age = age;public String getPwd() re

33、turn pwd;public void setPwd(String pwd) this.pwd = pwd;public String toString()return "Person:name="+name+"age="+age+""Overridepublic void writeExternal(ObjectOutput out) throws IOException / TODO Auto-generated method stubout.writeObject(name);out.writeInt(age);Overrid

34、epublic void readExternal(ObjectInput in) throws IOException,ClassNotFoundException / TODO Auto-generated method = (String)in.readObject();this.age = in.readInt();八、Serializable和Externalizable有什么異同?(1)Externalizable接口繼承自Serializable接口public interface Serializable public interface Exter

35、nalizable extends Serializable void readExternal(ObjectInput in); void writeExternal(ObjectOutput out); (2)外部化和序列化是實(shí)現(xiàn)同一目標(biāo)的兩種不同方法。通過(guò)Serializable接口對(duì)對(duì)象序列化的支持是內(nèi)建于核心 API 的,但是java.io.Externalizable的所有實(shí)現(xiàn)者必須提供讀取和寫出的實(shí)現(xiàn)。Java 已經(jīng)具有了對(duì)序列化的內(nèi)建支持,也就是說(shuō)只要制作自己的類java.io.Serializable,Java 就會(huì)試圖存儲(chǔ)和重組你的對(duì)象。如果使用外部化,你就可以選擇完全由自

36、己完成讀取和寫出的工作,Java 對(duì)外部化所提供的唯一支持是接口: voidreadExternal(ObjectInput in) void writeExternal(ObjectOutput out) 現(xiàn)在如何實(shí)現(xiàn)readExternal() 和writeExternal() 就完全看你自己了。 序列化會(huì)自動(dòng)存儲(chǔ)必要的信息,用以反序列化被存儲(chǔ)的實(shí)例,而外部化則只保存被存儲(chǔ)的類的標(biāo)識(shí)。當(dāng)你通過(guò)java.io.Serializable接口序列化一個(gè)對(duì)象時(shí),有關(guān)類的信息,比如它的屬性和這些屬性的類型,都與實(shí)例數(shù)據(jù)一起被存儲(chǔ)起來(lái)。在選擇走Externalizable這條路時(shí),Java 只存儲(chǔ)有關(guān)

37、每個(gè)被存儲(chǔ)類型的非常少的信息。 每個(gè)接口的優(yōu)點(diǎn)和缺點(diǎn) Serializable接口 · 優(yōu)點(diǎn):內(nèi)建支持 · 優(yōu)點(diǎn):易于實(shí)現(xiàn) · 缺點(diǎn):占用空間過(guò)大 · 缺點(diǎn):由于額外的開(kāi)銷導(dǎo)致速度變比較慢 Externalizable接口 · 優(yōu)點(diǎn):開(kāi)銷較少(程序員決定存儲(chǔ)什么) · 優(yōu)點(diǎn):可能的速度提升 · 缺點(diǎn):虛擬機(jī)不提供任何幫助,也就是說(shuō)所有的工作都落到了開(kāi)發(fā)人員的肩上。 在兩者之間如何選擇要根據(jù)應(yīng)用程序的需求來(lái)定。Serializable通常是最簡(jiǎn)單的解決方案,但是它可能會(huì)導(dǎo)致出現(xiàn)不可接受的性能問(wèn)題或空間問(wèn)題;在出現(xiàn)這些問(wèn)題的情況

38、下,Externalizable可能是一條可行之路。 要記住一點(diǎn),如果一個(gè)類是可外部化的(Externalizable),那么Externalizable方法將被用于序列化類的實(shí)例,即使這個(gè)類型提供了Serializable方法: private void writeObject() private void readObject()九、怎么序列化為xml文件?使用XStream(java對(duì)象與Xml轉(zhuǎn)換),下載地址:/引入xstream core only-1.4.1.jarxmlpull-.jarxpp3_min-1.1.4c.zip 等jar包,下載地址:/download.html(XStream支持一下幾種xml解析,官方推薦XmlPull、Xpp3具體Xml格式及XStream知識(shí)請(qǐng)查相關(guān)資料!package com.test.ser4;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import c

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論