zoukankan      html  css  js  c++  java
  • 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修饰,均不能被序列化。

  • 相关阅读:
    linux那点事儿(六)进程管理详解(推荐)
    linux那点事儿(下)
    视图的架构刷新和绑定
    HttpHandler开发的两个重点问题
    RichTextBox控件的几点有意思的东西
    重复输入某个字符(C++,C#)
    几个博客系统点评
    怎么理解符号整数的取值范围(C++)
    为SSIS编写自定义任务项(Task)之进阶篇
    LINQ TO XML之判断不存在行则插入
  • 原文地址:https://www.cnblogs.com/Ch1nYK/p/8982126.html
Copyright © 2011-2022 走看看