对象的序列化和反序列化
当两个进程远程通信时,彼此可以发送各种类型的数据,无论何种类型的数据都会以二进制序列的形式在网络上传送。我们也可以在网络上直接发送java对象,发送方需要把这个java对象转化为字节序列(把java对象转化为二进制序列的过程称为序列化),才能在网络上传送;接收方需要把字节序列再恢复为java对象(把二进制序列转化为java对象的过程称为反序列化)才能读取。
作用:
1持久化:把对象的字节序列永久的保存到硬盘上。
2网络通信:在网络是传送对象的字节序列。
序列化涉及的类和接口:
ObjectOutputStream代表对象输出流,它的writeObject(Object ob)方法可以参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
ObjectInputStream代表对象的输入流,它的readObject()方法从源输入流中读取字节序列,再把它们反序列化为一个对象。并将其返回
只有实现了Serializable接口的类的对象才能被序列化。Serializable接口是一个空接口,只起到标记作用。
对象流的基础数据使用
/**
* 基础数据使用对象流
*/
public class ObjectOutputStreamBasicTypeDemp {
public static void main(String[] args) {
ObjectOutputStream oos=null;
try{
oos=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("D:/output1.txt")));
oos.writeChar('a');
oos.writeDouble(Math.random());
oos.writeBoolean(true);
oos.writeUTF("中国宏");
oos.flush();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(oos!=null){
oos.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public class ObjectInputStreamBasicTypeDemp {
public static void main(String[] args) {
ObjectInputStream ois=null;
try{
ois=new ObjectInputStream(new BufferedInputStream(new FileInputStream("D:/output1.txt")));
//必须要按照写入顺序读取数据
System.out.println("char: "+ois.readChar());
System.out.println("Double: "+ois.readDouble());
System.out.println("Boolean: "+ois.readBoolean());
System.out.println("String: "+ois.readUTF());
}catch(Exception e){
e.printStackTrace();
}finally {
try {
if (ois!=null){
ois.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
将对象序列化到文件:
ObjectOutputStream可以将一个内存中的java对象通过序列化的方式写入到磁盘的文件中,被序列化的对象必须要实现Serializable序列化接口,否则会抛出异常
创建对象:
/**
* 创建一个实体类
*/
public class Users implements Serializable {
private int userid;
private String username;
private String userage;
public Users(int userid, String username, String userage) {
this.userid = userid;
this.username = username;
this.userage = userage;
}
public Users(){}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserage() {
return userage;
}
public void setUserage(String userage) {
this.userage = userage;
}
}
序列化对象:
public class ObjectOutputStreamObjectTypeDemo {
public static void main(String[] args) {
ObjectOutputStream oos=null;
try{
oos=new ObjectOutputStream(new FileOutputStream("D:/output4"));
Users us=new Users(1,"张三","18");
oos.writeObject(us); //将一个对象序列化到外部
oos.flush();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(oos!=null){
oos.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
将对象反序列化到内存中:
public class ObjectInputStreamObjectTypeDemo {
public static void main(String[] args) {
ObjectInputStream ois=null;
try{
ois=new ObjectInputStream(new FileInputStream("D:/output4"));
Users users=(Users)ois.readObject();
System.out.println(users.getUserid()+"\t"+users.getUsername()+"\t"+users.getUserage());
}catch(Exception e){
e.printStackTrace();
}finally {
try {
if(ois!=null){
ois.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
通过对象流可以做到实现数据的存储 ,比如电话本中的数据保存到磁盘上,而且对象流是可以对java中任何对象进行序列化处理只要对象实现了Serializable接口