• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

黄文超

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

javaIO中的序列化和反序列化

javaIO中的序列化和反序列化

1、什么是序列化?它是来解决什么问题的

1、我们创建的对象,一般情况下在内存中,程序关闭,或者因为没有地址指向而导致垃圾回收
2、这样,我们的对象就会丢失
3、那么我们就需要一种技术来把对象存在文件中,这样就不会丢失
4、因此,把对象存入文件,我们叫序列化技术,把文件中的对象取出来,我们叫反序列化技术。

2、如何实现序列化(例如:)

1、需要序列化的对象加一个标记接口Serializable

/**
* 1、需要序列化的对象加一个标记接口Serializable
*/
public class Book implements Serializable {
    int age;
    String name;
    public Book(int age,String name) {
        this.age = age;
        this.name = name;
    }

    public Book() {

    }

    @Override
    public String toString() {
        return "Book{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

2、直接进行IO操作即可

public class SerializeUser {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //序列化
        serializable();
        //反序列化
        deserializable();
    }

    /**
     * 序列化技术
     * @throws IOException 抛出IO异常给父亲
     */
    public static void serializable() throws IOException {
        Book book1 = new Book(12,"金苹果");
        Book book2 = new Book(13,"银苹果");
        List<Book> list = new ArrayList<>();
        list.add(book1);
        list.add(book2);
        FileOutputStream fos = new FileOutputStream("list.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(list);
        oos.close();
    }

    /**
     * 反序列化技术
     * @throws IOException 抛出IO异常给父亲
     * @throws ClassNotFoundException 抛出文件找不到异常给父亲
     */
    public static void deserializable() throws IOException, ClassNotFoundException {
        File file = new File("list.txt");
        FileInputStream fis = new FileInputStream("list.txt");
        if(!file.exists() || file.length() == 0)  {
            return;
        }
        ObjectInputStream ois = new ObjectInputStream(fis);
        List<Book> list = (List<Book>) ois.readObject();
        for(Book book: list) {
            System.out.println(book);
        }
    }

}

3、如何实现部分序列化

1、属性中添加添加修饰符transient的成员属性,这个成员属性不能被序列化,其他正常序列化
2、属性中添加static也是不能被序列化
3、在实现标记接口Serializable的类中重写writeObject,和ReadObject必须是private void类型(例如)
public class Book implements Serializable {
    int age;
    String name;
    public Book(int age,String name) {
        this.age = age;
        this.name = name;
    }

    public Book() {

    }
    
    /**
    * 将需要序列化的对象写到 out.writeObject()方法中
    */
    @Override
    private void writeObject() throws IOException {
        out.writeObject(age);
        out.writeObject(name);
    }
    
    /**
    * 和序列化对应,并和序列化的对象一一对应
    */
    @Override
    private void writeObject() throws IOException {
        int age = (int)in.writeObject();
        String name =(String) in.writeObject();
    }

    @Override
    public String toString() {
        return "Book{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

4、实现接口Externalizable,实现方法writeExternal和方法readExternal

posted on 2021-03-25 18:32  黄文超  阅读(100)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3