对象流(自学自用)

文章介绍了Java中对象的序列化和反序列化过程,包括如何使用ObjectOutputStream和ObjectInputStream进行操作。序列化用于将对象转化为字节序列,以便在网络传输或持久化存储,而反序列化则是将字节序列恢复为对象。只有实现了Serializable接口的类的对象才能被序列化。文章提供了基础数据类型和自定义对象的序列化与反序列化示例。
摘要由CSDN通过智能技术生成

对象的序列化和反序列化

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

作用:

        1持久化:把对象的字节序列永久的保存到硬盘上。

        2网络通信:在网络是传送对象的字节序列。

序列化涉及的类和接口:
        ObjectOutputStream代表对象输出流,它的writeObject(Object ob)方法可以参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

        ObjectInputStream代表对象的输入流,它的readObject()方法从源输入流中读取字节序列,再把它们反序列化为一个对象。并将其返回

        只有实现了Serializable接口的类的对象才能被序列化。Serializable接口是一个空接口,只起到标记作用。

对象流的基础数据使用

/**
 * 基础数据使用对象流
 */
public class ObjectOutputStreamBasicTypeDemp {
    public static void main(String[] args) {
        ObjectOutputStream oos=null;
        try{
            oos=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("D:/output1.txt")));
            oos.writeChar('a');
            oos.writeDouble(Math.random());
            oos.writeBoolean(true);
            oos.writeUTF("中国宏");
            oos.flush();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(oos!=null){
                    oos.close();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}
public class ObjectInputStreamBasicTypeDemp {
    public static void main(String[] args) {
        ObjectInputStream ois=null;
        try{
            ois=new ObjectInputStream(new BufferedInputStream(new FileInputStream("D:/output1.txt")));
            //必须要按照写入顺序读取数据
            System.out.println("char: "+ois.readChar());
            System.out.println("Double: "+ois.readDouble());
            System.out.println("Boolean: "+ois.readBoolean());
            System.out.println("String: "+ois.readUTF());

        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
                if (ois!=null){
                    ois.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

将对象序列化到文件:

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

创建对象:

/**
 * 创建一个实体类
 */
public class Users implements Serializable {
    private int userid;
    private String username;
    private String userage;

    public Users(int userid, String username, String userage) {
        this.userid = userid;
        this.username = username;
        this.userage = userage;
    }
    public Users(){}

    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;
    }
}

序列化对象:

public class ObjectOutputStreamObjectTypeDemo {
    public static void main(String[] args) {
        ObjectOutputStream oos=null;
        try{
            oos=new ObjectOutputStream(new FileOutputStream("D:/output4"));
            Users us=new Users(1,"张三","18");
            oos.writeObject(us); //将一个对象序列化到外部
            oos.flush();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(oos!=null){
                    oos.close();
                }

            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

 将对象反序列化到内存中:

public class ObjectInputStreamObjectTypeDemo {
    public static void main(String[] args) {
        ObjectInputStream ois=null;
        try{
            ois=new ObjectInputStream(new FileInputStream("D:/output4"));
            Users users=(Users)ois.readObject();
            System.out.println(users.getUserid()+"\t"+users.getUsername()+"\t"+users.getUserage());
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
                if(ois!=null){
                    ois.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

通过对象流可以做到实现数据的存储 ,比如电话本中的数据保存到磁盘上,而且对象流是可以对java中任何对象进行序列化处理只要对象实现了Serializable接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值