Java 流(Stream)简介:3、对象序列化

16 篇文章 0 订阅

对象序列化也是流应用的一个重要方面。序列化就是把一个对象转换成一串字节,既可以保存起来,也可以传给另外的 Java 程序使用。ObjectOutputStream 和 ObjectInputStream 就是专门用来进行序列化和反序列化的。下面就是一个简单的例子:

import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.EOFException;
 
/**
 * ObjectOutputStream/ObjectInputStream 示例。
 * 这两个类分别用于序列化和反序列化。
 */
public class SerializationDemo {
 
    public static void main(String[] args) throws Exception {
        String path = "c:/persons.data";
        File f = new File(path);
        if (!f.exists()) {
            f.createNewFile();
        }
 
        writePersons(path);
        readPersons(path);
    }
 
    // 从指定的文件中读取 Person 对象
    private static void readPersons(String path) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
 
        Person p;
        while (true) {
            try {
                p = (Person) ois.readObject();
                System.out.println(p);
            } catch (EOFException e) {
                break;
            }
        }
    }
 
    // 将 Person 对象保存到指定的文件中
    private static void writePersons(String path) throws IOException {
        Person[] persons = new Person[]{
                new Person("张三", 23),
                new Person("李四", 24)
        };
 
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
        for (Person person : persons) {
            oos.writeObject(person);
        }
        oos.close();
    }
 
    ///
 
    private static class Person implements Serializable {
 
        private String name;
 
        private int age;
 
        public Person() {
        }
 
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
 
        public String getName() {
            return name;
        }
 
        public void setName(String name) {
            this.name = name;
        }
 
        public int getAge() {
            return age;
        }
 
        public void setAge(int age) {
            this.age = age;
        }
 
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '/'' +
                    ", age=" + age +
                    '}';
        }
    }
}

这个例子里面看不到字节和字符的读写,因为这两个类都包装好了。上面只是一个简单的例子,序列化要写好的话还是有不少讲究的。想深入了解序列化,可以看看这里。本文只关注跟流有关的部分。其实序列化用的很少,因为序列化降低了灵活性,所以可以不用的话一般都不会用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值