zoukankan      html  css  js  c++  java
  • 16 IO流(十三)——Object流 序列化与反序列化

    Object流、序列化与反序列化

    Object流是将 可序列化的对象 进行序列化与反序列化的流。

    可序列化的对象:使用关键字Serializable修饰,表示这个对象可以进行序列化与反序列化。

    序列化:序列化即将对象转换为字节数组进行传输或出错。

    反序列化:将含对象的字节数组转为对象。

    就如我们的Data流一样,Data流保存的是基础数据类型,Object保存的是引用数据类型。

    也与Data流一样,读取写入的顺序要保持一致。

    需要注意的细节

    Object流与Data流有好几个相似的方法:

    反序列化时需要使用instanceOf判断类型是否相同在做转换。

    可序列化的类中不需要序列化的数据用 transient修饰,在反序列化后,该数据为null。

    private transient String name = "";
    

      

    反序列化时,读取对象,需要用Object来接收,然后判断接收到的是否为对应的类的对象,如果是再强转。

    Object str = ois.readObject();//用Object接收。readObject方法可能会报classNotFound异常,必须处理
    if(strObject instanceof String){//判断
    	String strObjecet = (String)str;//强转为String类型
    	System.out.println(strObject);
    }
    

      

    本节完整代码

    import java.io.*;
    public class ObjectTest
    {
    	/**
    	*为了演示,先写入流,再从流中读取
    	*ObjectInputStream与ObjectOutputStream
    	*/
    	public static void main(String[] args){
    		//输出流
    		ByteArrayOutputStream baos = new ByteArrayOutputStream ();
    		ObjectOutputStream oos = null;
    		
    		try{
    		oos = new ObjectOutputStream(baos);
    		//操作:写入基础数据类型
    		oos.writeUTF("谁言寸草心");
    		oos.writeFloat(2.2f);
    		//写入引用类型数据
    		oos.writeObject("我真的是一个好人");//写入String类型
    		Person p = new Person("马云",1000);
    		oos.writeObject(p);
    		oos.flush();//刷新流
    		
    		byte[] datas = baos.toByteArray();//提出数据
    		//输入流
    		ObjectInputStream ois = 
    			new ObjectInputStream(
    				new ByteArrayInputStream(datas));
    		//操作:读取数据-基础类型
    		String str = ois.readUTF();
    		System.out.println(str);
    		float f = ois.readFloat();
    		System.out.println(f);
    		//读取数据-引用类型
    		Object str1 = ois.readObject();
    		Object p1 = ois.readObject();
    		if(str1 instanceof String){
    			String strObject = (String)str1;//强转为String类型
    			System.out.println(strObject);
    		}
    		if(p1 instanceof Person){
    			Person p2 = (Person)p1;
    			System.out.println("姓名:"+p2.getName()+" 工资:"+p2.getSalary());
    		}
    
    		}catch(ClassNotFoundException e){
    			e.printStackTrace();
    		}catch(IOException e){
    			e.printStackTrace();
    		}
    	}
    }
    class Person implements Serializable //实现Serializable接口
    {
    	private transient String name = "";//使用transient修饰的不会被序列化
    	private int salary = 0;
    	public Person(){
    		
    	}
    	public Person(String name,int salary){
    		this.name = name;
    		this.salary = salary;
    	}
    	public String getName(){
    		return name;
    	}
    	public int getSalary(){
    		return salary;
    	}
    }
    

      

    结果:

  • 相关阅读:
    VSCode 配置 Python 开发环境
    出现:Microsoft Visual C++ 14.0 is required 的解决方案
    python3 pathlib库中的Path类的使用
    使用 AI 绘制箭头
    Adobe Illustrator 入门 新建 保存图片
    jinja2
    Java 读取和写入文本文件
    Affy包 estrogen包
    GEOquery
    apply() 函数家族介绍
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/11928287.html
Copyright © 2011-2022 走看看