Java中如何实现序列化

本文介绍了序列化和反序列化的概念,展示了Java中如何通过ObjectOutputStream和ObjectInputStream进行对象的序列化和反序列化,以及transient关键字、static属性和serialVersionUID在序列化中的作用和常见问题。
摘要由CSDN通过智能技术生成

序列化的定义

序列化:把对象转化为可传输的字节序列过程称为序列化。

反序列化:把字节序列还原为对象的过程称为反序列化。

为什么要序列化?

        当两个进程进行网络传输时,需要发送各种类型的数据,如图片,文档等,而这些数据在网络中往往以二进制的形式传输,因此,在发送数据时我们需要对数据序列化将其转化为二进制序列,当接受数据时则需要将二进制序列反序列化恢复成原先的数据对象。

Java 是如何实现序列化的?

        在Java中提供了ObjectlnputStream与ObjectOutputStream这两个类用于序列化对象的操作。使用对象输出流输出序列化对象(序列化)。使用对象输入流读入对象(反序列化)。进行序列化,反序列化的对象必须实现Serializable接口,Serializable接口中没有定义任何方法,仅仅被用作一种标记,以被编译器作特殊处理。

public class Student implements Serializable{
 //年龄
 private int age;
 //名字
 private String name ;

 public int getAge() {
 return age;
    }
 public void setAge(int age) {
 this.age = age;
    }

 public String getName() {
 return name;
    }

 public void setName(String name) {
 this.name = name;
    }
}

把Student对象设置值后写入文件

FileOutputStream fos = new FileOutputStream("D:\JavaFileTest\HomeWork2\students.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);

Student stu=new Student();
stu.setAge(18);
stu.setName("LiHua");
oos.writeObject(stu);

oos.flush();
oos.close();

 再从文件读取出来转换为对象

FileInputStream fis = new FileInputStream("D:\JavaFileTest\HomeWork2\students.txt");

ObjectInputStream oin = new ObjectInputStream(fis);

Student stu=(Student) oin.readObject();

System.out.println("name="+stu.getName()+"age"+stu.age);

以上把Student对象进行二进制的数据存储后,并从文件中读取数据出来转成Student对象就是一个序列化和反序列化的过程。 

JAVA序列化中常见的问题

transient关键字

transient修饰的属性,不可以被序列化

static 属性不能被序列化

序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。

被序列化的类的内部的所有属性,必须是可序列化的

serialVersionUID 常量

 在对象进行序列化或反序列化操作的时候,如果序列化的 JDK 版本和反序列化的 JDK 版本不统一,则可能造成异常。因此在序列化操作中引入了一个serialVersionUID 的常量来验证版本的一致性。在进行反序列化时,JVM 会把传来的字节流中的 serialVersionUID 与本地相应实体(类)的serialVersionUID 进行比较。如果相同就可以进行反序列化,否则就会出现异常。

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值