php 序列化 java_JAVA之序列化
1、问题:
如果想往一个文件中写入一个对象,发现字节流,字符流都不能满足要求, 如何向一个文件中写入对象?
使用字节字符流,都必须要将对象转为字节/字符,再写到文件中,可以字节字符流没有将对象转为字节的方法,这要如何做?
2、序列化与反序列化
Java序列化:将对象转为字节的过程,这正好符合我的需求。
Java反序列化:将字节恢复为对象的过程
这满足我们想文件中写对象,和读取对象
3、序列化和反序列化的使用场景a、将对象写道硬盘中;
b、网络间传输当在网络上传送文本,音频,视频等,都是转化为二进制序列传送,我们要在网络上传送对象,就必须使用序列化和反序列化,满足数据的发送和接收。
###4、序列化和反序列化的好处
一、实现数据的持久化,通过序列化将数据永久的保存在本地的硬盘上;
二、实现远程网络通信,利用序列化,使得在网络上可以传输对象的字节序列。
5、如何实现序列化和反序列化
5.1 、实现Serializable接口
Serializable接口没有任何方法,只是提供一个标识 , 用来告诉java机制该类可以被序列化;
如果没有创建这个标识,java机制将会自动的创建一个,SerialVersionUID是根据类名, 接口名,成员方法及属性等来生成一个64位哈希字段。如果没有SerialVersionUID, 通常我们会发现,如果在序列化后,修改了类的属性, 在进行反序化,会报错,因为累的属性修改了,java机制会重新创建一个SerialVersionUID, 导致与原来的ID不一致, 反序列化失败。如果设置了实现SerialVersionUID, 保证版本的兼容性, 即使添加了属性或方法, 仍然能进行序列化和反序列化, 只是新添加的属性值为null,或不显示被删除属性的值。package com.chb.test;import java.io.Serializable;public class Student implements Serializable{
//序列化标识
private static final long serialVersionUID = 1L;
private String name;
private int age;
private String sex;
public Student() {
}
public Student(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Student{"
+"姓名:"+this.name
+"性别:"+this.sex
+"年龄"+this.age
+ "}";
}
/**setter getter 省略。。。*/
}
5.2、ObjectOutputStream与ObjectInputStream
Serializalable接口只是提供一个表示,将对象转为二进制序列,和二进制序列恢复成对象是由ObjectOutputStream和OjbectInputStream提供的两个方法:writeObject()和readObject()writeObject()public static void write(Student s1) throws Exception {
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(s1);
oos.close();
}readObject()public static Student read() throws Exception {
FileInputStream fis = new FileInputStream(filename);
ObjectInputStream ois = new ObjectInputStream(fis);
Student stu = new Student(); //使用readeObject()进行反序列化
stu= (Student) ois.readObject();
ois.close(); return stu;
}
6、transient
在某种场合,我们对某些敏感字段不要进行序列化,或者类的引用类型的成员不能够进行序列化, 这是我们需要使用transient来修饰这些成员, 以避免它们被序列化。如:银行账户对象,不希望对账户金额进行序列化。
修改上面的Student类,将sex属性使用transient修饰transient private String sex;
再进行序列化Student s1 = new Student("roase",19, "女");
write(s1);
反序列化, 读取的对象发现:sex为null,说明被transient修饰的属性不会被序列化。
6.1 defaultWriteObject和defaultReadObject()
对于上面的被transient的成员age, 如果我们想让它能够在此序列化和反序列化,要如何做:1、去掉transient的修饰
2、提供两个方法private void writeObject(ObjectOutputStream out) throws Exception{
out.defaultWriteObject();
out.writeInt(age);
}
private void readObject(ObjectInputStream in) throws Exception {
in.defaultReadObject();
age=in.readInt();
}
在writeObject()方法中会先调用ObjectOutputStream中的defaultWriteObject()方法,该方法会执行默认的序列化机制,此时会忽略掉age字段。然后再调用writeInt()方法显示地将age字段写入到ObjectOutputStream中。readObject()的作用则是针对对象的读取,其原理与writeObject()方法相同。再次执行read()应用程序,则又会有如下输出:
1、问题:
如果想往一个文件中写入一个对象,发现字节流,字符流都不能满足要求, 如何向一个文件中写入对象?
使用字节字符流,都必须要将对象转为字节/字符,再写到文件中,可以字节字符流没有将对象转为字节的方法,这要如何做?
2、序列化与反序列化
Java序列化:将对象转为字节的过程,这正好符合我的需求。
Java反序列化:将字节恢复为对象的过程
这满足我们想文件中写对象,和读取对象
3、序列化和反序列化的使用场景a、将对象写道硬盘中;
b、网络间传输当在网络上传送文本,音频,视频等,都是转化为二进制序列传送,我们要在网络上传送对象,就必须使用序列化和反序列化,满足数据的发送和接收。
###4、序列化和反序列化的好处
一、实现数据的持久化,通过序列化将数据永久的保存在本地的硬盘上;
二、实现远程网络通信,利用序列化,使得在网络上可以传输对象的字节序列。
5、如何实现序列化和反序列化
5.1 、实现Serializable接口
Serializable接口没有任何方法,只是提供一个标识 , 用来告诉java机制该类可以被序列化;
如果没有创建这个标识,java机制将会自动的创建一个,SerialVersionUID是根据类名, 接口名,成员方法及属性等来生成一个64位哈希字段。如果没有SerialVersionUID, 通常我们会发现,如果在序列化后,修改了类的属性, 在进行反序化,会报错,因为累的属性修改了,java机制会重新创建一个SerialVersionUID, 导致与原来的ID不一致, 反序列化失败。如果设置了实现SerialVersionUID, 保证版本的兼容性, 即使添加了属性或方法, 仍然能进行序列化和反序列化, 只是新添加的属性值为null,或不显示被删除属性的值。package com.chb.test;import java.io.Serializable;public class Student implements Serializable{
//序列化标识
private static final long serialVersionUID = 1L;
private String name;
private int age;
private String sex;
public Student() {
}
public Student(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Student{"
+"姓名:"+this.name
+"性别:"+this.sex
+"年龄"+this.age
+ "}";
}
/**setter getter 省略。。。*/ }
5.2、ObjectOutputStream与ObjectInputStream
Serializalable接口只是提供一个表示,将对象转为二进制序列,和二进制序列恢复成对象是由ObjectOutputStream和OjbectInputStream提供的两个方法:writeObject()和readObject()writeObject()public static void write(Student s1) throws Exception {
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(s1);
oos.close();
}readObject()public static Student read() throws Exception {
FileInputStream fis = new FileInputStream(filename);
ObjectInputStream ois = new ObjectInputStream(fis);
Student stu = new Student(); //使用readeObject()进行反序列化
stu= (Student) ois.readObject();
ois.close(); return stu;
}
6、transient
在某种场合,我们对某些敏感字段不要进行序列化,或者类的引用类型的成员不能够进行序列化, 这是我们需要使用transient来修饰这些成员, 以避免它们被序列化。如:银行账户对象,不希望对账户金额进行序列化。
修改上面的Student类,将sex属性使用transient修饰transient private String sex;
再进行序列化Student s1 = new Student("roase",19, "女");
write(s1);
反序列化, 读取的对象发现:sex为null,说明被transient修饰的属性不会被序列化。
6.1 defaultWriteObject和defaultReadObject()
对于上面的被transient的成员age, 如果我们想让它能够在此序列化和反序列化,要如何做:1、去掉transient的修饰
2、提供两个方法private void writeObject(ObjectOutputStream out) throws Exception{
out.defaultWriteObject();
out.writeInt(age);
}
private void readObject(ObjectInputStream in) throws Exception {
in.defaultReadObject();
age=in.readInt();
}
在writeObject()方法中会先调用ObjectOutputStream中的defaultWriteObject()方法,该方法会执行默认的序列化机制,此时会忽略掉age字段。然后再调用writeInt()方法显示地将age字段写入到ObjectOutputStream中。readObject()的作用则是针对对象的读取,其原理与writeObject()方法相同。再次执行read()应用程序,则又会有如下输出:
以上就是JAVA之序列化的内容,更多相关内容请关注PHP中文网(www.php.cn)!
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
php 序列化 java_JAVA之序列化相关推荐
- json 序列化 java_Java JSON序列化杂谈
在C#中序列化是比较容易的,如果不用第三方的类库,那么C#提供的两个对象也够我们使用,一般的操作是定义一个不含有方法的类,这个类里面定义了要序列化的对象的属性,因为我C#用的比较多,这里直接给出泛型, ...
- java 对象怎么序列化,java对象序列化总结
java对象序列化小结 百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储 ...
- 解决Python自带的json序列化工具不能序列化datetime类型数据问题
解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...
- Java序列化闲聊:序列化和Json
前言 其实我挺纠结的,在纠结到底要不要写这个模块的博客,因为序列化这个模块说简单,按照一些人的说法,其实也就是调两个函数的事情,说困难,铺开就让人感觉范围很广. 序列化 什么是序列化,我们在编程的时候 ...
- Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑
前言 上一篇已经介绍了优雅的操作Redis: [小家Spring]Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入的问题.本篇着重 ...
- Java中 byte[]数组序列化和fastjson序列化区别
Java中 byte[]数组序列化和fastjson序列化区别 Java中,对于对象可以通过序列化成byte数组或者序列化成json形式,这里做下两者的对比. 首先看下实现方式: 1 byte数组序列 ...
- java get方法不序列化_java常用序列化与反序列化方法
序列化工具类 序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象. 主要的目的是方便传输和存储. 序列化工具类: public class SerializeUtil { private ...
- Atitit php序列化 php的serialize序列化和json序列化
Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP with ...
- java序列化深克隆_克隆可序列化和不可序列化的Java对象
java序列化深克隆 开发人员经常依靠3d方库来避免重新发明轮子,尤其是在Java世界中,Apache和Spring这样的项目如此盛行. 在处理这些框架时,我们通常很少或根本无法控制其类的行为. 这有 ...
最新文章
- 影响HP服务器的磁盘性能的重要因素 -- 阵列卡的缓存和电池
- mysql找安装路经,更改密码
- 深入了解Java 8中的可选类API
- 使用Netapp与windows server 2012搭建 iSNS服务器
- 自己的工作计划-备忘
- 【元胞自动机】基于matlab元胞自动机晶体生长【含Matlab源码 232期】
- Opencv2与Opencv4共存
- 如何减小电压跟随器输出电阻_电压跟随器只会跟踪?不!请看看它对电路的“魔力”。...
- 记录将pycharm中的caches缓存文件转移到D盘
- 新·自学日语教材推荐加点评
- day18私有化、关联、继承
- ubuntu手动设置ip地址和网关
- 当技术重构遇上DDD,如何实现业务、技术双赢?
- APP UI结构-首页功能点大集锦,很干很详细
- 【PHP框架 | Laravel8 系列3】 - 路由
- Java架构师教你如何突破瓶颈,下载量瞬秒百万
- 2021复旦大学计算机专业,2021年度复旦大学计算机科学技术学院多媒体技术基础试题.doc...
- Arduino开发(一)_软件开发IDE工具的安装
- Doug Lea了解下
- 京东商城的商品分类代码
热门文章
- androidstudio自带git用法_Android Studio使用Git版本控制github
- matlab 回路最优,数学建模常用Matlab/Lingo/c代码总结系列——hamilton回路
- HikariDataSource 监控_Prometheus监控告警浅析
- java读写excel文件poi_Java利用POI读写Excel文件工具类
- pandas dataframe随机采样
- mpi4py安装报错error: Cannot compile MPI programs. Check your configuration!!!
- linux+广播程序,Linux系统下广播程序制作介绍(上) (3)
- mysql数据类型的学习心得_MySQL自学总结 (一到四章)
- 误差函数拟合优缺点_欠拟合、过拟合及如何防止过拟合
- 电脑怎么远程控制另一台电脑_如何用手机远程控制电脑?