《对象序列化、Properties类》
开发工具与关键技术:MyEclipse 10、Java
作者:潘玉莹
撰写时间:2019-06-08
一、 什么是对象序列化
对象序列化的目标是将对象保存在磁盘中,或允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成与平台无关的是二进制,从而允许把这种二进制持久保存在磁盘上,通过网络将这种二进制传输到另一个网路节点。其他程序一旦获取这种二进制(无论是从磁盘中获取的,还是通过网络获取的)都可以将这种二进制恢复成原来的Java对象。
二、 序列化的含义和意义
序列化机制允许将实现的Java对象转换为字节序列,这些字节序列可以保持在磁盘上,或通过网络传输,以备以后重新恢复成原来的对象。序列化机制使得对象可以脱离程序运行而独立存在
对象的序列化指将一个Java对象写入IO流中,于此对应的是,对象的反序列化则指从IO流中恢复Java对象如果需要让某个对象序列化机制,则必须让他的是可序列化的
为了让某个类可序列化,该类必须实现两个接口之一
Serializable(常用)
ExternalizableJava
很多类已经实现了Serializable 该接口是一个标记接口,实现给接口无须实现任何方法,他只是表明该类是可序列化的
所有可能在网络上传输的对象的类都是可序列化的,否则程序将出现异常
序列化过程
public class ObjectStream{
public static void main(String[] args) throws Exception{
Person person = new Person(“小明”,20) //定义一个类并创建实例
//实例化 FileOutputStream
FileOutputStream out = new FileOutputStream(“E:\z\person.txt”);
//实例化 ObjectOutputStream
ObjectOutputStream outputStream = new ObjectOutputStream(out);
// 调用ObjectOutputStream对象的writeObject()方法输出可序列化对象
outputStream.writeObject(person);
//关闭 ObjectOutputStream
outputStream.close();
}
}
输出结果是:有参构造器
反序列过程
必须指出的是,反序列化读取的仅仅是Java对象的数据,而不是Java类,因此采用反序列化恢复Java对象时,必须提供该Java对象所属类的Class文件,否则将会引发ClassNotFoundException异常
反序列化无需通过构造器来初始化Java对象
//实例化 FileInputStream
FileInputStream in = new FileInputStream(“E:\z\person.txt”);
//实例化 ObjectInputStream
ObjectInputStream inputStream = new ObjectInputStream(in);
Person person2 = (com.gx.iodemo.Person) inputStream .readObject();
//关闭 ObjectInputStream
inputStream.close();
System.out.println(“name=”+person2.getName());
System.out.println(“age=”+person2.getAge());
输出结果是:name=小明 age=20;
注: Person类必须实现序列化否则将不能如上功能:代码如图所示
Class Person implements implements SerialiZable{
private static final long serialVersionUID = ‐3138823756540735938L;
private String name;//私有化成员变量
private String age;
public Person() {
System.out.println(“无参构造器”);
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println(“有参构造器”);
}
注: Person类必须实现序列化否则将不能如上功能:代码如图所示
Properties类
Properties类代表的是Java中操作配置文件的类
如果我们需要用到关于Properties类,第一步就是要进行实例
Properties properties = new Properties();
如在我们的Java项目中,如果不用 Properties 类去获取连接数据库的相对应的参数,则需要写大量去获取,有了 Properties 类,我们可以更快的获取到需要的数据
以下是一个配置的实例
public class PropertiesDemo {
public static void main(String[] args) throws IOException{
Properties properties = new Properties();//第一步实例
FileInputStream in = new FileInputStream("./src/test.properties");// 1、字节流(输入) Reader
properties.load(in);//读取
Reader reader = new FileReader(new File("./src/test.properties"));// 2、字符流(输入) Reader
properties.load(reader);
reader.close();
System.out.println(“name:”+properties.getProperty(“name”)); //读取配置内容
//指定默认值,当无法找到key时返回指定的默认值
//当 key不存在时,不指定默认值输出为null,指定默认值后输出默认值
System.out.println(“name:”+properties.getProperty(“name”,“233333”));
//设置配置的值
//当key存在时,修改值;key不存在时,添加
properties.setProperty(“name”,“西米”);
properties.setProperty(“height”, String.valueOf(170));
properties.remove(“height”);
properties.list(System.out); //1.输出到控制台
PrintStream outputStream=new PrintStream(new File("./src/test.properties"
properties.store(outputStream,“这是注释”);
输出结果是:name:小明
Name:小明
Age=10
Name=西米