目录
一、java序列化存,反序列化读
二、javar tansient关键字
一、java序列化存,反序列化读
Java序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。
代码:
/**
* @ClassName: ProducerConsumerDemo
* @Description: TODO(请用一句话描述这个类的作用)
* @date 2016年12月4日 下午3:23:26
* @author 张海平
* 湖南师范大学工程与设计学院前栋407工作室
*
*/
package com.zhanghaiping.javaHomeWork;
import java.io.Serializable;
public class Student implements Serializable
{
private String name;
private char sex;
private int year;
private double gpa;
public Student()
{
}
public Student(String name,char sex,int year,double gpa)
{
this.name = name;
this.sex = sex;
this.year = year;
this.gpa = gpa;
}
public void setName(String name)
{
this.name = name;
}
public void setSex(char sex)
{
this.sex = sex;
}
public void setYear(int year)
{
this.year = year;
}
public void setGpa(double gpa)
{
this.gpa = gpa;
}
public String getName()
{
return this.name;
}
public char getSex()
{
return this.sex;
}
public int getYear()
{
return this.year;
}
public double getGpa()
{
return this.gpa;
}
}
反序列化读:
/**
* @ClassName: ProducerConsumerDemo
* @Description: TODO(请用一句话描述这个类的作用)
* @date 2016年12月4日 下午4:13:26
* @author 张海平
* 湖南师范大学工程与设计学院前栋407工作室
*
*/
package com.zhanghaiping.javaHomeWork;
import java.io.*;
public class UseStudent
{
public static void main(String[] args)
{
Student st = new Student("Tom",'M',20,3.6);
File file = new File("O:\\Java\\com\\jieke\\io\\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());
System.out.println("sex = " + st1.getSex());
System.out.println("year = " + st1.getYear());
System.out.println("gpa = " + st1.getGpa());
ois.close();
fis.close();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
运算结果:
name = Tom
sex = M
year = 20
gpa = 3.6
二、javar tansient关键字
一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java的这种序列化模式为开发者提供了很多便利,可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个的所有属性和方法都会自动序列化。但是有种情况是有些属性是不需要序列号的,所以就用到这个关键字。只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。 代码:实现Serializable接口的UserInfo类,并且有一个transient关键字修饰的属性.
/**
* @ClassName: ProducerConsumerDemo
* @Description: TODO(请用一句话描述这个类的作用)
* @date 2016年12月4日 下午5:13:26
* @author 张海平
* 湖南师范大学工程与设计学院前栋407工作室
*
*/
package com.zhanghaiping.javaHomeWork;
import java.io.Serializable;
public class UserInfo implements Serializable {
private static final long serialVersionUID = 1L;
private String name ;
private transient String pwd ;
public UserInfo(String name,String pwd){
this.name =name;
this.pwd =pwd;
}
public String toString(){
return "name=" +name +",psw=" +pwd ;
}
}
通过输入输出流编写的测试程序:
/**
* @ClassName: ProducerConsumerDemo
* @Description: TODO(请用一句话描述这个类的作用)
* @date 2016年12月4日 下午5:48:26
* @author 张海平
* 湖南师范大学工程与设计学院前栋407工作室
*
*/
package com.zhanghaiping.javaHomeWork;
public class TestTransient {
public static void main(String[] args) {
UserInfouserInfo = new UserInfo("张三" , "123456" );
System. out.println(userInfo);
try {
// 序列化,被设置为transient的属性没有被序列化
ObjectOutputStreamo = new ObjectOutputStream(new FileOutputStream(
"UserInfo.out"));
o.writeObject(userInfo);
o.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
// 重新读取内容
ObjectInputStream in = new ObjectInputStream( new FileInputStream(
"UserInfo.out"));
UserInforeadUserInfo = (UserInfo) in.readObject();
// 读取后psw的内容为null
System. out.println(readUserInfo.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
总结:
1)Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。
2)采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。
为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。