• IO---对象流


    对象流


    类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。通俗来说就是将数据结构或对象转换成二进制串的过程。
    

    ObjectOutputStream


    writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。
    

    eg:

        public class Person implements Serializable{
    
    	private static final long serialVersionUID = 3851308503396805613L;
    	private String userName;
    	transient private String password;
    	private static String sex;
    	
    	public Person(String userName,String password,String sex) {
    		this.userName = userName;
    		this.password = password;
    		this.sex = sex;
    	}
    	
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	
    	@Override
    	public String toString() {
    		return "Person userName:"+userName +"  password:"+password + " sex:"+sex;
    	}
    
    	public static String getSex() {
    		return sex;
    	}
    
    	public static void setSex(String sex) {
    		Person.sex = sex;
    	}
    
    }
    
    public class ObjectTest {
    	
    	public static void main(String[] args) throws IOException {
    		OutputStream os = new FileOutputStream(new File("d:/blog/object.tmp"));
    		ObjectOutputStream oos = new ObjectOutputStream(os);
    		Person p = new Person("testUser","test1234","man"); 
    		oos.writeObject(p);
    		oos.close();
            os.close();
    	}
    }
    

    ObjectInputStream


    readObject 方法用于从流读取对象。应该使用 Java 的安全强制转换来获取所需的类型。在 Java 中,字符串和数组都是对象,所以在序列化期间将其视为对象。读取时,需要将其强制转换为期望的类型。 
    

    eg:

    InputStream is = new FileInputStream(new File("d:/blog/object.tmp"));
    ObjectInputStream ois = new ObjectInputStream(is);
    p.setUserName("testTest");
    p.setSex("woman");
    p = (Person)ois.readObject();
    System.out.println(p.toString());
    ois.close();
    is.close();
    

    总结

    当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID一致,如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功,否则失败。
    一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。一个静态变量不管是否被transient修饰,均不能被序列化。

  • 相关阅读:
    关于meta便签详解
    移动端等分比显示导航状态
    css3单选 复选按钮--代码分享
    css-样式重构-代码分享
    代码分享h5-sessionStorage,提示app下载代码块
    微信浏览器打开 点击下载app 无需提示使用浏览器打开--代码分享
    js 判断IOS版本号
    二进制,八进制,十进制,十六进制之间的转换
    JS组件系列——Bootstrap文件上传组件:bootstrap fileinput
    Bootstrap文件上传插件File Input的使用
  • 原文地址:https://www.cnblogs.com/Ch1nYK/p/8982126.html
Copyright © 2020-2023  润新知