package cn.serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* 今天整理以下关于Java的对象序列化相关的问题:
*
* [ObjectOutputStream,ObjectInputStream]
*
*
* 序列化:
* 是指将对象以字节序列的方式表示;其中包括对象的数据,对象的类型,对象中存储的属性;
* 当字节序列写出到文件中后相当于把对象持久化了;以上便是Java对象的序列化;
*
* 反序列化:
* 是指将字节序列从文件中读取出来的重构对象的方式;
*
* 其中:
* 序列化的对象需要满足两个先决条件:
* 1. 该类必须实现java.io.Serializable接口;
* 2. 该类中的所有属性必须是可序列化的;
* 如果有不需要序列化的属性可以用transient标记对应的属性;
*
* 接下来还开始相关的随笔;
*
* 还是同以往一样,创建一个自己的测试类;
* @author Administrator
*
*/
public class SerializableTest {
/**
* Java程序的入口|主函数;
* @param args
*/
public static void main(String[] args) {
// 初始化一个文件流路径;
String path = "D://user.txt";
// 实例化一个自己的Users类;
Users user = new Users();
// 初始化一个空的Users对象;
Users userRead = null;
/**
* 对象赋值;
* 当前为私有方式,故而需set赋值;
* 普通公共访问权限直接引用对象.就可以得到;
*/
user.setNAME("Liu .....");
user.setPS("wcadmin");
user.setAGE(110);
user.setID_CARD("622222222111114448");
try {
/**
* 序列化;
*
* 指定序列化地址,实例化ObjectOutputStream序列化对象;
*/
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
// 指定对象的进行序列化;
oos.writeObject(user);
// 资源释放;
oos.close();
/**
* 反序列化;
* 指定序列化地址,实例化ObjectInputStream反序列化对象;
*/
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
/**
* 读取序列化数据;
* 指定转换对象类型;
*/
userRead = (Users) ois.readObject();
// 资源释放;
ois.close();
// 获取并打印对象信息;
System.out.println("name: "+userRead.getNAME());
System.out.println("ps: "+userRead.getPS());
System.out.println("age: "+userRead.getAGE());
System.out.println("id_card: "+userRead.getID_CARD());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
/**
* 封装临时的Entity类;
* @author Administrator
*/
class Users implements java.io.Serializable {
/**
* 定义私有变量;
* NAME;
* PS;
* AGE;
* ID_CARD;
*/
private String NAME;
private String PS;
private Integer AGE;
/**
* transient关键字:
* 用来标记不需要序列化的数据属性及内容;
* 表示瞬时态;
*/
private transient String ID_CARD;
// 定义临时调用方法;
public void goining() {
System.out.println("This is "+ NAME + AGE);
}
/**
* 提供get|set方法;
* @return
*/
public String getNAME() {
return NAME;
}
public void setNAME(String nAME) {
NAME = nAME;
}
public String getPS() {
return PS;
}
public void setPS(String pS) {
PS = pS;
}
public Integer getAGE() {
return AGE;
}
public void setAGE(Integer aGE) {
AGE = aGE;
}
public String getID_CARD() {
return ID_CARD;
}
public void setID_CARD(String iD_CARD) {
ID_CARD = iD_CARD;
}
}
package cn.serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
*
* 数据集合的序列化也是同数据对象的序列化一样;
* 下面的继续走一则有关序列化的Demo:
*
* 集合序列化;
*
* @author Administrator
*
*/
public class SerializableTest {
/**
* Java程序的入口|主函数;
* @param args
*/
public static void main(String[] args) {
// 初始化一个文件流路径;
String path = "D://List.txt";
// 利用构造器实例化多个对象;
Users usera = new Users("Liu","admin");
Users userb = new Users("Wang","wcadmin");
Users userc = new Users("Fei","123");
Users userd = new Users("Hu","123445");
// 实例化一个指定装载Users对象的List容器;
List<Users> list = new ArrayList<Users>();
// List集合数据转载;
list.add(usera);
list.add(userb);
list.add(userc);
list.add(userd);
try {
/**
* 序列化;
*
* 指定序列化地址,实例化ObjectOutputStream序列化对象;
*/
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
// 指定对象的进行序列化;
oos.writeObject(list);
// 资源释放;
oos.close();
/**
* 反序列化;
* 指定序列化地址,实例化ObjectInputStream反序列化对象;
*/
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
/**
* 读取序列化数据;
* 指定转换对象类型;
*/
List<Users> listUsers = (List<Users>) ois.readObject();
// 资源释放;
ois.close();
// 获取并打印对象信息;
for(Users user : listUsers) {
System.out.println("NAME: " + user.getNAME() + "; PS: " + user.getPS());
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
/**
* 封装临时的Entity类;
* @author Administrator
*/
class Users implements java.io.Serializable {
/**
* 定义私有变量;
* NAME;
* PS;
* AGE;
* ID_CARD;
*/
private String NAME;
private String PS;
private Integer AGE;
/**
* transient关键字:
* 用来标记不需要序列化的数据属性及内容;
* 表示瞬时态;
*/
private transient String ID_CARD;
public Users (){}
public Users (String name, String ps) {
this.NAME = name;
this.PS = ps;
}
// 定义临时调用方法;
public void goining() {
System.out.println("This is "+ NAME + AGE);
}
/**
* 提供get|set方法;
* @return
*/
public String getNAME() {
return NAME;
}
public void setNAME(String nAME) {
NAME = nAME;
}
public String getPS() {
return PS;
}
public void setPS(String pS) {
PS = pS;
}
public Integer getAGE() {
return AGE;
}
public void setAGE(Integer aGE) {
AGE = aGE;
}
public String getID_CARD() {
return ID_CARD;
}
public void setID_CARD(String iD_CARD) {
ID_CARD = iD_CARD;
}
}