【Java知识点详解 3】序列化与反序列化

Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

(2)序列化后流的长度比通过缓冲区处理要大的多。

(3)序列化性能太低

三、序列化使用场景

=========

1、分布式传递对象,或者网络传输,需要序列化

2、我调用你的jvm的方法,结果返回到我的jvm上进行处理

3、序列化可以保持对象的状态

比如:tomcat关闭以后会把session对象序列化到SESSIONS.ser文件中,等下次启动的时候就把这些session再加载到内存里面来。

4、数据传输并复原

在j2ee中页面与后台使用的比较多。尤其是在列表中的时候使用尤为突出。

比如:一个人员的列表保存起来的话,你可以将这个列表序列化,传到后台,然后再反序列化成person对象直接进行对象的保存。

5、比如EJB远程调用 分布式存储,缓存存储等

6、像银行卡、密码这些字段不能被序列化

四、序列化和反序列化的注意事项

===============

1、Java序列化的方式


实现 Serializable 接口:可以自定义 writeObject、readObject、writeReplace、readResolve 方法,会通过反射调用。

实现 Externalizable 接口:需要实现 writeExternal 和 readExternal 方法。

2、序列化ID问题


虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。

3、静态字段不会序列化


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

4、transient


transient代表对象的临时数据。

如果你不想让对象中的某个成员被序列化可以在定义它的时候加上 transient 关键字进行修饰,这样,在对象被序列化时其就不会被序列化。

transient 修饰过的成员反序列化后将赋予默认值,即 0 或 null。

有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

5、父类的序列化


当一个父类实现序列化,子类自动实现序列化;而子类实现了 Serializable 接口,父类也需要实现Serializable 接口。

6、当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化


7、并非所有的对象都可以序列化


(1)安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行RMI传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的;

(2)资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现;

8、序列化解决深拷贝问题


如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存,这是能用序列化解决深拷贝的重要原因。

五、代码实例

======

1、实体类


package javase.transientpackage;

import java.io.Serializable;

public class User implements Serializable {

private static final long serialVersionUID = 1L;

private String username;

private transient String password;

//construct、setter、getter

}

2、ObjectOutputStream实现序列化和ObjectInputStream实现反序列化


package javase.transientpackage;

import java.io.*;

public class TransientTest {

public static void main(String[] args) {

try {

SerializeUser();

DeSerializeUser();

} catch (IOException e) {

e.printStackTrace();

}catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

//序列化

private static void SerializeUser() throws IOException{

User user = new User();

user.setUsername(“素小暖”);

user.setPassword(“123456”);

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“D://data.txt”));

oos.writeObject(user);

oos.close();

System.out.println("普通字段序列化:username= "+user.getUsername());

System.out.println("添加了transient关键字序列化:password= "+user.getPassword());

}

//反序列化

private static void DeSerializeUser() throws IOException, ClassNotFoundException {

File file = new File(“D://data.txt”);

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));

User user = (User)ois.readObject();

System.out.println("普通字段反序列化:username= "+user.getUsername());

System.out.println("添加了transient关键字反序列化:password= "+user.getPassword());

}

}

3、控制台输出


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

写在最后

可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。

复习一周,字节跳动三场技术面+HR面,不小心拿了offer

复习一周,字节跳动三场技术面+HR面,不小心拿了offer

上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。

[外链图片转存中…(img-U5PlarJe-1713527816468)]

[外链图片转存中…(img-2QOw2adJ-1713527816470)]

上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值