java序列化与反序列化

本文详细介绍了Java中对象序列化和反序列化的方法,包括使用Serializable接口、XML序列化、FastJson和Hessian等。同时,讨论了序列化过程中的安全校验,如UID一致性检查,以及如何通过自定义writeObject和readObject方法增强字段控制。此外,对比了不同序列化方式的优缺点,如字节大小、可读性和效率。
摘要由CSDN通过智能技术生成

Serializable

byte[] - Java原生

// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("template"));
oos.writeObject(user);
oos.close();
// 反序列化
File file = new File("template");
ObjectInputStream ois = new ObjectInputStream(newFileInputStream(file));
User user = (user)ois.readObject();

UID

  • 序列化和反序列化的安全校验
  • 如果UID不同,不能反序列化

Translent

  • 标识之后的字段不允许序列化和反序列化,字段会为空

  • // 但是可以通过writeObject和readObject重新实现字段

    private void writeObject(java.io.ObjectOutputStream s) throw IOException

    private void readObject(java.io.ObjectInputStram s)) throws IOException, ClassNotFoundException

序列化

xml - XStraem

XStream xStream = new XStream(new DomDriver());
// 序列化
xStream.toXML(obj);
// 反序列化
xStream.fromXML(string);
  • 方便阅读
  • 长度很大
  • writeObject和readObject无效

json - FastJson

// 序列化
JSON.toJSONString(obj);
// 反序列化
(User)JSON.parseObject(string, User.class)
  • writeObject和readObject无效
  • 可以不implement java.io.Serializable

byte[] - hessian

// 序列化
User user = new User().setName("jiangtao").setAge("19");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
HessianOutput hessianOutput = new HessianOutput(outputStream);
hessianOutput.writeObject(user);
String data = outputStream.toString();
System.out.println(data);
// 放序列化
ByteArrayInputStream inputStream = new ByteArrayInputStream(data.getBytes());
HessianInput hessianInput = new HessianInput(inputStream);
System.out.println(hessianInput.readObject(User.class));
  • java原生的字节大小较大

protobuf

  • 有自己的编译器和语法

  • 生成一个带有序列化和反序列化的对象

  • 压缩解压

  • 不传属性,约定属性位置

  • ASCIII

  • Tag | [length] | value : tag为字段标识, 类型(当前字段编号<<3)

其它序列化方法: avro kyro …

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值