Java:基于对象流、字节流、文件流的Serializable和深拷贝

1 Serializable接口概述

有时候我们有一种需求,保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且想把保存的对象状态再读出来,这样既可以实现对象的传递。
实现这一需求的方式有很多,比如,使用objectMapper序列化为Json字符串/对象,再进行传递或者保存,Java的设计指出也考虑到了这种需求,就设计出了Serializable接口,该接口没有必要实现的方法,默认继承了该接口后会就能自动调用java默认的序列化和放序列化。

2 Serializable接口代码实践

定义一个类用于序列化:UserInfo .java

@Getter
@Setter
public class UserInfo implements Serializable{
    //实现Serializable接口才能被序列化
    private String userName;
    private String usePass;
    private transient int userAge;//使用transient关键字修饰的变量不会被序列化
    public UserInfo() {
   
        userAge=20;
    }
    public UserInfo(String userName, String usePass, int userAge) {
   
        super();
        this.userName = userName;
        this.usePass = usePass;
        this.userAge = userAge;
    }

    @Override 
    public String toString() {
   
        return "UserInfo [userName=" + userName + ", usePass=" + usePass + ",userAge="+(userAge==0?"NOT SET":userAge)+
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用对象方式实现深拷贝对象方式包括ObjectInputStream和ObjectOutputStream两个类。 要实现深拷贝,需要满足两个条件: 1. 对象必须实现Serializable接口。 2. 对象的所有引用类型成员变量也必须实现Serializable接口。 下面是一个示例代码,演示如何使用对象方式实现深拷贝: ```java import java.io.*; class MyClass implements Serializable { private String name; private int age; public MyClass(String name, int age) { this.name = name; this.age = age; } // Getters and setters public String toString() { return "Name: " + name + ", Age: " + age; } } public class DeepCopyExample { public static void main(String[] args) throws IOException, ClassNotFoundException { MyClass obj1 = new MyClass("John", 25); // 使用对象方式进行深拷贝 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); out.writeObject(obj1); out.flush(); out.close(); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream in = new ObjectInputStream(bis); MyClass obj2 = (MyClass) in.readObject(); in.close(); // 修改obj1的值,不会影响obj2 obj1.setName("Mike"); obj1.setAge(30); System.out.println("obj1: " + obj1); System.out.println("obj2: " + obj2); } } ``` 在上面的示例中,首先创建了一个MyClass对象obj1,然后使用对象方式进行深拷贝,将obj1写入字节数组输出,并通过字节数组输入读取到obj2中。 最后,修改了obj1的值,但是不会影响到obj2的值。这证明了对象方式实现的是深拷贝。 需要注意的是,对象方式实现深拷贝的前提是被拷贝的对象及其所有引用类型成员变量都必须实现Serializable接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值