美文网首页
Java 序列化

Java 序列化

作者: Tinyspot | 来源:发表于2022-08-28 07:47 被阅读0次

    1. Java 原生序列化

    • 序列化:把内存中数据写入文件中
    • 反序列化:从文件中读取数据到内存中
    • 使用流传输对象的过程称为序列化、反序列化

    2. 序列化使用

    // 必须实现 Serializable 接口,否则会报错 java.io.NotSerializableException
    public class Student implements Serializable {
        // 序列化版本号,保证序列化和反序列化的是同一个类
        private static final long serialVersionUID = -3881208742057626511L;
    }
    
        // 序列化
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("src/main/resources/student.bin"));
        Student student = new Student("tinyspot", 20);
        out.writeObject(student);
        out.close();
    
        // 反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src/main/resources/student.bin"));
        Student student = (Student) ois.readObject();
        ois.close();
        System.out.println(JSON.toJSONString(student));
    

    2.1 绕过 transient

    会通过反射调用 readObject(java.io.ObjectInputStream s) 和 writeObject(java.io.ObjectOutputStream s)

    public class User implements Serializable {
        private static final long serialVersionUID = -5324601100478775753L;
        private transient String name;
        private Integer age;
    
        private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException {
            s.defaultReadObject();
            s.readObject();
        }
    
        private void writeObject(java.io.ObjectOutputStream s) throws IOException {
            s.defaultWriteObject();
            s.writeObject(name);
        }
    }
    

    3. 示例

    public static void main(String[] args) {
        ISerializer serializer = new FileSerializer();
        User user = new User("Tinyspot", 20);
        serializer.serializer(user);
    
        User result = serializer.deSerializer(null, null);
        System.out.println(result);
    }
    
    public interface ISerializer {
        
        <T> byte[] serializer(T obj);
    
        <T> T deSerializer(byte[] data, Class<T> clazz);
    }
    
    public class JavaSerialier implements ISerializer {
    
        @Override
        public <T> byte[] serializer(T obj) {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            try {
                ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream);
                outputStream.writeObject(obj);
                return byteArrayOutputStream.toByteArray();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return new byte[0];
        }
    
        @Override
        public <T> T deSerializer(byte[] data, Class<T> clazz) {
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
            try {
                ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream);
                return (T) inputStream.readObject();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    
    public class FileSerializer implements ISerializer {
        @Override
        public <T> byte[] serializer(T obj) {
            try {
                ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(new File("src/main/resources/user")));
                outputStream.writeObject(obj);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return new byte[0];
        }
    
        @Override
        public <T> T deSerializer(byte[] data, Class<T> clazz) {
            try {
                ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(new File("src/main/resources/user")));
                return (T) inputStream.readObject();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    相关文章

      网友评论

          本文标题:Java 序列化

          本文链接:https://www.haomeiwen.com/subject/wqjvvltx.html