序列化反序列化api(入门级)
定義:
java序列化是指把Java對象轉換為字節序列的過程;而Java反序列化是指把字節序列恢復為Java對象的過程。
為什么字符串通常也會進行序列化?
對象需要進行序列化的原因:保證對象的狀態不變(比如一個studunet);
字符串通常也進行序列化的原因:為了保證解析不出意外(比如編碼可能不一致)(雖然字符串不序列化一般也不會報錯)。
同時以下原因也是一個很重要的因素:
對象、文件、數據,有許多不同的格式,很難統一傳輸和保存,
序列化以后就都是字節流了,無論原來是什么東西,都能變成一樣的東西,就可以進行通用的格式傳輸或保存,傳
輸結束以后,要再次使用,就進行反序列化還原,這樣對象還是對象,文件還是文件。
jdk提供的api:
java.io.ObjectOutputStream:表示對象輸出流
它的writeObject(Object obj)方法可以對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
java.io.ObjectInputStream:表示對象輸入流
它的readObject()方法源輸入流中讀取字節序列,再把它們反序列化成為一個對象,并將其返回。
?
實現序列化的要求
只有實現了Serializable或Externalizable接口的類的對象才能被序列化,否則拋出異常。
實現Java對象序列化與反序列化的方法
假定一個Student類,它的對象需要序列化,可以有如下三種方法:
方法一:若Student類僅僅實現了Serializable接口,則可以按照以下方式進行序列化和反序列化
ObjectOutputStream采用默認的序列化方式,對Student對象的非transient的實例變量進行序列化。
ObjcetInputStream采用默認的反序列化方式,對對Student對象的非transient的實例變量進行反序列化。
方法二:若Student類不僅僅實現了Serializable接口,并且還定義了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),則采用以下方式進行序列化與反序列化。
ObjectOutputStream調用Student對象的writeObject(ObjectOutputStream out)的方法進行序列化。
ObjectInputStream會調用Student對象的readObject(ObjectInputStream in)的方法進行反序列化。
方法三:若Student類實現了Externalnalizable接口,且Student類必須實現readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,則按照以下方式進行序列化與反序列化。
ObjectOutputStream調用Student對象的writeExternal(ObjectOutput out))的方法進行序列化。
ObjectInputStream會調用Student對象的readExternal(ObjectInput in)的方法進行反序列化。
?
序列化的步驟:
步驟一:創建一個對象輸出流,它可以包裝一個其它類型的目標輸出流,如文件輸出流:
ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“D:\\objectfile.obj”));
步驟二:通過對象輸出流的writeObject()方法寫對象:
out.writeObject(“Hello”);
out.writeObject(new Date());
?
反序列化的步驟:
步驟一:創建一個對象輸入流,它可以包裝一個其它類型輸入流,如文件輸入流:
ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\\objectfile.obj”));
步驟二:通過對象輸出流的readObject()方法讀取對象:
String obj1 = (String)in.readObject();
Date obj2 = (Date)in.readObject();
?
對String類型數據進行序列化反序列化demo:
public class SerializeAndDeserialize {// 序列化
public static byte[] serialize(Object o){
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try{
baos= new ByteArrayOutputStream();
oos=new ObjectOutputStream(baos);
oos.writeObject(o);
byte[] bytes=baos.toByteArray();
return bytes;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
// 反序列化
public static Object deserialize(byte [] bytes){
ByteArrayInputStream bai=null;
ObjectInputStream ois=null;
try {
bai=new ByteArrayInputStream(bytes);
ois=new ObjectInputStream(bai);
return ois.readObject();
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public static void main(String []args){
System.out.println( serialize("asdasdasdad"));
System.out.println( deserialize(serialize("asdasdasdad")));
}
}
?
對實體類進行實例化:
實體類:
public class Student implements Serializable
{
?private String name;
?
?public Student()
?{}
?public Student(String name)
?{
? this.name = name;
?}
?public void setName(String name)
?{
? this.name = name;
?}
?public String getName()
?{
? return this.name;
?}
}
?
序列化反序列化:
public class UseStudent
{
?public static void main(String[] args)
?{
? Student st = new Student("Tom");
? File file = new File("E:\\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());
? ?ois.close();
? ?fis.close();
? }
? catch(ClassNotFoundException e)
? {
? ?e.printStackTrace();
? }
? catch (IOException e)
? {
? ?e.printStackTrace();
? }
?}
}
以上。
達者為師,分享之上
參考博客:http://blog.csdn.net/wangloveall/article/details/7992448/
?
轉載于:https://www.cnblogs.com/zqsky/p/6088431.html
總結
以上是生活随笔為你收集整理的序列化反序列化api(入门级)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sass学习笔记
- 下一篇: 从0开始学Swift笔记整理(一)