zoukankan      html  css  js  c++  java
  • java为什么要实现serializable序列化

    我们有时候想把一个对象写到一个文件上,实现持久化,可以这么做

    class User{
        
        String userName ;
        
        String password;
    
        public User(String userName , String passwrod) {
            this.userName = userName;
            this.password = passwrod;
        }
        
        @Override
        public String toString() {
            return "用户名:"+this.userName+ " 密码:"+ this.password;
        }
    }
    
    public class Test {
        
        public static void main(String[] args) throws IOException, Exception {
            writeObj();
        }    
    
        //定义方法把对象的信息写到硬盘上------>对象的序列化。
        public static void writeObj() throws IOException{
            //把user对象的信息持久化存储。
            User user = new User("admin","123");
            //找到目标文件
            File file = new File("/Users/chen/Downloads/obj.txt");
            //建立数据输出流对象
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            //建立对象的输出流对象
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            //把对象写出
            objectOutputStream.writeObject(user);
            //关闭资源
            objectOutputStream.close();
            
            
        }
    }

    运行时发现报错java

    Exception in thread "main" java.io.NotSerializableException: User

    要求必要需实现serializable接口,serializable接口没有任何方法,是一个标识接口。

    在user类后面implements Serializable,然后打开obj.txt文件会发现是一堆字节码文件,这是原先的对象编译后的,我们如果要看这个对象需要反序列化

    class User implements Serializable{
        
        String userName ;
        
        String password;
    
        public User(String userName , String passwrod) {
            this.userName = userName;
            this.password = passwrod;
        }
        
        @Override
        public String toString() {
            return "用户名:"+this.userName+ " 密码:"+ this.password;
        }
    }
    
    public class Test {
        
        public static void main(String[] args) throws IOException, Exception {
            writeObj();
            readObj();
        }    
    
        //定义方法把对象的信息写到硬盘上------>对象的序列化。
        public static void writeObj() throws IOException{
            //把user对象的信息持久化存储。
            User user = new User("admin","123");
            //找到目标文件
            File file = new File("/Users/chen/Downloads/obj.txt");
            //建立数据输出流对象
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            //建立对象的输出流对象
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            //把对象写出
            objectOutputStream.writeObject(user);
            //关闭资源
            objectOutputStream.close();
            
            
        }
        
        //把文件中的对象信息读取出来-------->对象的反序列化
        public static void readObj() throws  IOException, ClassNotFoundException{
            //找到目标文件
            File file = new File("/Users/chen/Downloads/obj.txt");
            //建立数据的输入通道
            FileInputStream fileInputStream = new FileInputStream(file);
            //建立对象的输入流对象
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            //读取对象信息
            User user = (User) objectInputStream.readObject(); //创建对象肯定要依赖对象所属 的class文件。
            System.out.println("对象的信息:"+ user);
        }
    }
    View Code

    输出:

    对象的信息:用户名:admin 密码:123

  • 相关阅读:
    BiscuitOS/Linux 上构建 GFP_ZONE_TABLE【转】
    二、buildroot 构建交叉编译工具链【转】
    buildroot构建项目(一)---buildroot介绍【转】
    使用buildroot创建自己的交叉编译工具链【转】
    使用buildroot制作交叉编译工具链【转】
    Perf 简介【转】
    linux perf工具测试程序cpu cache刷回实验【转】
    Linux下的内核测试工具——perf使用简介【转】
    Build failed in step 'Retrieving needed toolchain components' tarballs【转】
    利用Crosstool-ng制作交叉编译工具链【转】
  • 原文地址:https://www.cnblogs.com/cracker13/p/9518227.html
Copyright © 2011-2022 走看看