java中的Serializable提供一种持久化机制,将实现了Serializable接口的对象序列化为字节序列,并在以后可以将此字节序列恢复为java对象。
序列化实现了数据的持久化,保存在硬盘中,并且在网络上进行字节序列的传送。
transient:在序列化时,若字段定义为transient,则会自动对该字段不进行序列化。不让序列化机制进行自动保存与恢复,则加上transient
举例说明:
package day01;
import java.io.Serializable;
import java.util.Date;
/**
* @author wangpei
* @version
*创建时间:2017年1月17日 下午7:39:15
* 练习序列化
*/
public class xuliehua implements Serializable {
private Date nowtime=new Date();
private String uid;
private transient String pswd;
xuliehua(String uid,String pswd ){
this.uid=uid;
this.pswd=pswd;
}
public String toString(){
String password=null;
if(pswd==null)
password="没有值";
else
password=pswd;
return "nowtime="+nowtime+"uid="+uid+"pswd="+password;
}
package day01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* @author wangpei
* @version
*创建时间:2017年1月17日 下午7:48:12
*
*/
public class test {
public static void main(String[] args) {
xuliehua m=new xuliehua("xiaozhang","123" );
ObjectOutputStream o;
//序列化
try {
o = new ObjectOutputStream(
new FileOutputStream("logInfo.out"));
o.writeObject(m);
o.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//反序列化
try
{
ObjectInputStream in =new ObjectInputStream(
new FileInputStream("logInfo.out"));
xuliehua logInfo = (xuliehua)in.readObject();
System.out.println(logInfo.toString());
}
catch(Exception e) {//deal with exception}
}
}
}
执行后:
nowtime=Tue Jan 17 20:21:17 CST 2017uid=xiaozhangpswd=没有值
注意:在对字节序列进行反序列化的过程中,没有调用任何的构造器,包括默认的构造器,整个对象都是通过从InputStream 中去得数据而进行恢复的。举例:
package day01;
import java.io.Serializable;
import java.util.Date;
/**
* @author wangpei
* @version
*创建时间:2017年1月17日 下午7:39:15
* 练习序列化
*/
public class xuliehua implements Serializable {
private Date nowtime=new Date();
private String uid;
private transient String pswd;
xuliehua( ){
this.uid=”xiaozhang”;
this.pswd=”123”;
}
public String toString(){
String password=null;
if(pswd==null)
password="没有值";
else
password=pswd;
return "nowtime="+nowtime+"uid="+uid+"pswd="+password;
}
}
package day01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* @author wangpei
* @version
*创建时间:2017年1月17日 下午7:48:12
*
*/
public class test {
public static void main(String[] args) {
xuliehua m=new xuliehua();
ObjectOutputStream o;
try {
o = new ObjectOutputStream(
new FileOutputStream("logInfo.out"));
o.writeObject(m);
o.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try
{
ObjectInputStream in =new ObjectInputStream(
new FileInputStream("logInfo.out"));
xuliehua logInfo = (xuliehua)in.readObject();
System.out.println(logInfo.toString());
}
catch(Exception e) {//deal with exception}
}
}
}
结果:
nowtime=Tue Jan 17 20:29:27 CST 2017uid=xiaozhangpswd=没有值
分析pswd仍然是空值,即使在构造方法中已经对其进行了初始化,但是在恢复的过程中只是调用了序列化后的InputStream中的值,而序列化后的pswd为空值,反序列化也为空。
要序列化一个对象,首先,创建某些OutputStream(例如:FileOutputStream)对象,然后将其封装在ObjectOutputStream对象中,然后调用,writeObject方法,并将其发送给OutputStream,即可进行序列化,反序列化基本相同只不过是读出。
代码:
try {
o = new ObjectOutputStream(
new FileOutputStream(“logInfo.out”));
o.writeObject(m);
o.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
“`