• java 对象序列化与反序列化


    序列化和反序列化是什么

    当两个进程远程通信时,彼此可以发送各种类型的数据。 无论是何种类型的数据,都 会以二进制序列的形式在网络上传送。比如,我们可以通过 http 协议发送字符串信息;我 们也可以在网络上直接发送 Java 对象。发送方需要把这个 Java 对象转换为字节序列,才能 在网络上传送;接收方则需要把字节序列再恢复为 Java 对象才能正常读取。
    把 Java 对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为 Java 对象的 过程称为对象的反序列化。

    对象序列化的作用有如下两种:

    • 持久化: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
    • 网络通信:在网络上传送对象的字节序列。比如:服务器之间的数据通信、对象传递。(消息中间件之间对象的传输)

    序列化涉及的类和接口

    • ObjectOutputStream 代表对象输出流,它的 writeObject(Object obj)方法可对参数指定的 obj 对象进行序列化,把得到的字节序列写到一个目标输出流中。
    • ObjectInputStream 代表对象输入流,它的 readObject()方法从一个源输入流中读取字节 序列,再把它们反序列化为一个对象,并将其返回。
      只有实现了 Serializable 接口的类的对象才能被序列化。Serializable 接口是一个空接口, 只起到标记作用。

    操作对象

    将对象序列化到文件

    ObjectOutputStream 可以将一个内存中的 Java 对象通过序列化的方式写入到磁盘的文 件中。被序列化的对象必须要实现 Serializable 序列化接口,否则会抛出异常。

    定义实体类对象
    package com.io;
    
    import java.io.Serializable;
    
    public class Users implements Serializable {
        private int userId;
        private String userName;
        private String userAge;
    
        public Users() {
        }
    
        public Users(int userId, String userName, String userAge) {
            this.userId = userId;
            this.userName = userName;
            this.userAge = userAge;
        }
    
        public int getUserId() {
            return userId;
        }
    
        public void setUserId(int userId) {
            this.userId = userId;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getUserAge() {
            return userAge;
        }
    
        public void setUserAge(String userAge) {
            this.userAge = userAge;
        }
    }
    
    
    对象序列化
    package com.io;
    
    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    
    /**
     * 对象序列化的过程:就是将对象转换成字节
     */
    public class ObjectOutputStreamObjectTypeDemo {
        public static void main(String[] args) {
            ObjectOutputStream oos = null;
    
            try {
                oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("/Users/pain_/Desktop/b/c/b")));
                Users user = new Users(1, "kevin", "18");
                oos.writeObject(user);
                oos.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (oos != null) {
                        oos.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
    对象反序列化
    package com.io;
    
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.ObjectInputStream;
    
    /**
     * 对象反序列化:字节转对象
     */
    public class ObjectInputStreamObjectTypeDemo {
        public static void main(String[] args) {
            ObjectInputStream ois = null;
    
            try {
                ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("/Users/pain_/Desktop/b/c/b")));
                Users users = (Users) ois.readObject();
                System.out.println("Id:" + users.getUserId() + "	" + "姓名:" + users.getUserName() + "	" + "年龄" + users.getUserAge());
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (ois != null) {
                        ois.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    悲观者正确,乐观者成功
  • 相关阅读:
    3.4.2内核下的I2C驱动
    AS3批量替换文件
    文件访问权限
    Windows快捷键
    整数与字符串之间的转换函数
    Windows获取文件大小
    Windows内核对象
    ASCII字符集
    IP协议
    获取真正的进程/线程句柄
  • 原文地址:https://www.cnblogs.com/freebule/p/14462647.html
Copyright © 2020-2023  润新知