关于Java序列化你应该知道的一切
时间:2022-05-06
本文章向大家介绍关于Java序列化你应该知道的一切,主要内容包括什么是序列化、怎么序列化一个对象?、序列化注意事项、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
什么是序列化
我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。
Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据保存到磁盘或者传输网络,磁盘或者网络接收者可以在对象的属类的模板上来反序列化类的对象,达到对象持久化的目的。
怎么序列化一个对象?
要序列化一个对象,这个对象所在类就必须实现Java序列化的接口:java.io.Serializable。
1、类添加序列化接口
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = -8475669200846811112L;
private String username;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"username='" + username + ''' +
", address='" + address + ''' +
'}';
}
}
2、序列化/反序列化
可以借助commons-lang3工具包里面的类实现对象的序列化及反序列化,你没有必要自己写。
import org.apache.commons.lang3.SerializationUtils;
public class Test {
public static void main(String[] args) {
User user = new User();
user.setUsername("Java");
user.setAddress("China");
byte[] bytes = SerializationUtils.serialize(user);
User u = SerializationUtils.deserialize(bytes);
System.out.println(u);
}
}
输出:
User{username='Java', address='China'}
上例通过序列化对象字节到内存然后反序列化,当然里面也提供了序列化磁盘然后再反序列化的方法,原理都是一样的,只是目标地不一样。
序列化注意事项
- 序列化对象必须实现序列化接口。
- 序列化对象里面的属性是对象的话也要实现序列化接口。
- 类的对象序列化后,类的序列化ID不能轻易修改,不然反序列化会失败。
- 类的对象序列化后,类的属性有增加或者删除不会影响序列化,只是值会丢失。
- 如果父类序列化了,子类会继承父类的序列化,子类无需添加序列化接口。
- 如果父类没有序列化,子类序列化了,子类中的属性能正常序列化,但父类的属性会丢失,不能序列化。
- 用Java序列化的二进制字节数据只能由Java反序列化,不能被其他语言反序列化。如果要进行前后端或者不同语言之间的交互一般需要将对象转变成Json/Xml通用格式的数据,再恢复原来的对象。
- 如果某个字段不想序列化,在该字段前加上transient关键字即可。
看完有没有收获?
分享到朋友圈给更多的人吧。
- httphandler和httpmodule的区别
- 每周.NET前沿技术文章摘要(2017-06-21)
- Access数据库多表连接查询
- Lucene2.1 的官方示例代码
- 使用NUnit在.Net编程中进行单元测试
- 在CentOS上使用Jexus托管运行 ZKEACMS
- PowerDesigner生成Access数据库
- TechEmpower 13轮测试中的ASP.NET Core性能测试
- 反馈型神经网络
- (Head First 设计模式)学习笔记(1)
- [c#]Webservice中如何实现方法重载(overload)以及如何传送不能序列化的对象作参数
- Web.Config文件配置小记
- [原创]web application中使用Profile应该注意的问题
- MRTG FOR WINDOWS 安装指南
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- R语言中自编基尼系数的CART回归决策树的实现
- ArrayList的删除姿势你都掌握了吗
- sas神经网络:构建人工神经网络模型来识别垃圾邮件
- R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用
- 10分钟带你入门git到github
- 微服务[学成在线] day18:基于oauth2实现RBAC认证授权、微服务间认证实现
- 【TBase开源版测评】分布式事务全局一致性
- R语言进阶之主成分分析
- 二胖写参数校验的坎坷之路
- 图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
- R语言时间序列数据指数平滑法分析交互式动态可视化
- R语言进阶之图形的合并
- R语言广义线性模型索赔频率预测:过度分散、风险暴露数和树状图可视化
- 还在使用Future轮询获取结果吗?CompletionService快来了解下。
- R语言通过伽玛与对数正态分布假设下的广义线性模型对大额索赔进行评估预测