zoukankan      html  css  js  c++  java
  • Java对象流与序列化学习

    对象流与序列化

    对象流有两个类

    • ObjectOutputStream:将java对象的基本数据类型和图形写入OutputStream
    • ObjectInputStream:对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化。

    序列化一组对象

    同时序列化多个对象时,反序列化也必须按顺序操作,如果想要序列化一组对象该如何操作呢?

    • 序列化一组对象可采用:对象数组的形式,因为对象数组可以向Object进行转型操作。

    transient关键字

    • 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。

    能序列化的要求

    • 如果一个类创建的对象,需要被序列化,那么该类必须实现Serializable接口。
    • Serializable接口是一个标记接口,没有任何定义。
    • 如果对象没有实现该接口,会抛出java.io.NotSerializableException

    什么时候需要被序列化呢?

    • 把文件保存到文件中,存储到物理介质
    • 对象需要在网络上传输

    示例代码

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.io.Serializable;
    
    import org.junit.Test;
    
    
    public class ObjectStreamDemo {
    
    	/**
    	 * 对象反序列化,将对象从文件读到程序
    	 */
    	@Test
    	public void readObject() {
    		File file = new File("F:/dog.obj");
    		try {
    			InputStream in = new FileInputStream(file);
    			ObjectInputStream ois = new ObjectInputStream(in);
    
    			Dog dog = (Dog) ois.readObject();
    			System.out.println(dog);
    			ois.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}// readObject
    
    	/**
    	 * 对象序列化:实际写入的是类名、属性名、属性类型、属性值等
    	 * 将对象写入到文件
    	 */
    	@Test
    	public void writeObject() {
    		Dog dog = new Dog("Tom", "男", 2);
    		File file = new File("F:/dog.obj");
    
    		try {
    			OutputStream out = new FileOutputStream(file);
    			ObjectOutputStream oos = new ObjectOutputStream(out);
    
    			oos.writeObject(dog);
    			oos.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}// writeObject
    }
    

    需要被序列化的Dog类,必须实现标记接口Serializable

    class Dog implements Serializable {
    
    	// 序列号,保证读取时的编号和存储时的一致,方能读取
    	private static final long serialVersionUID = -3094355583246045443L;
    	private String name;
    	private String sex;
    	private int age;
    	private transient int id;// 在序列化时被忽略
    
    	public Dog() {}
    	public Dog(String name, String sex, int age) {
    		this.name = name;
    		this.sex = sex;
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    	return "Dog [name=" + name + ", sex=" + sex + ", age=" + age + "]";
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    }
  • 相关阅读:
    SuperSocket 1.4系列文档(16) 在SuperSocket中启用传输层加密(TLS/SSL)
    SuperSocket 1.4系列文档(10) SuperSocket中的日志功能
    UIPageControl实现自定义按钮
    ios 某些代码网址,app打包成ipa
    笔记隐藏状态栏,播放音乐,获取文件路径,nsthread,文件文件夹操作,plist 时间
    使用NSTimer实现倒计时,Iphone幻灯片效果+背景音乐,
    如何让你的iPhone程序支持多语言环境(本地化)
    iPhone电子书toolbar的实现
    iphone界面如何实现下拉列表
    使用NSTimer与iphone的简单动画,实现飘雪效果
  • 原文地址:https://www.cnblogs.com/zxfei/p/10877510.html
Copyright © 2011-2022 走看看