网站首页 > java教程 正文
Java提供了一种对象序列化的机制,指的就是将一个对象表示成一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中的数据类型信息。然后将其写入文件中或者数据库中以保存,如果需要使用它时,在通过反序列化的方式拿到它,其包换的信息依旧能够获得。
为什么我们需要序列化对象?
当需要将对象存入到网络中、文件中、数据库中的时候,就需要序列化对象。网络设备和存储设备只能理解位和字节,而不能理解对象,序列化将对象转化成字节就可以网络发送或者存入内存了。
为什么我们需要将对象储存或者传递?
1. 对象创建取决于很多上下文,一旦创建,其他的组件就需要它的方法或者字段;
2. 当对象创建后,我们不确定使用哪个字段,因此将其存储到数据库以便以后的数据分析。
序列化和反序列化例子如下:
public class SerializationTest { public static void main(String[] args){ Bird bird = new Bird(); bird.setName("shane"); bird.setColor("read"); bird.setWeight(2.3); //序列化对象 try { FileOutputStream fileOutputStream = new FileOutputStream("c:/bird.ser"); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(bird); objectOutputStream.close(); fileOutputStream.close(); System.out.println("序列化Bird被写入了文件/bird.ser中。"); } catch (IOException e) { e.printStackTrace(); } //去序列化 bird = null; try { FileInputStream fileInputStream = new FileInputStream("c:/bird.ser"); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); bird = (Bird)objectInputStream.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("bird的名字是: " + bird.getName()); System.out.println("bird的颜色是: " + bird.getColor()); System.out.println("bird的重量是: " + bird.getWeight()); bird.introduce(); } } class Bird implements Serializable{ private static final long serialVersionUID = -5742822984616863149L; private String name; private String color; private transient double weight;//表示序列化过程不会对字段weight操作 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public void introduce(){ System.out.println("I hava a " + name + " " + color + " bird."); } }
终端输出结果为:
输关于序列化的几点总结:
(1)一个类的对象想要被序列化,需要满足两个条件:1)该类必须实现java.io.Serializable接口;2)该类的所有属性必须是可序列化的,如上述例子,属性weight被声明为transient时,该属性是不能随对象保存的,当对该类序列化时,会自动忽略transient修饰的字段;
(2)当序列化一个对象到文件系统时,按照Java的标准约定是给文件一个.ser扩展名;
(3)当序列化时,ObjectOutputStream类是用来序列化的数据流,writeObject(Object object)方法将对象写入流中;当反序列化时,ObjectInputStream类是用来序列化的数据流,readObject()返回读取的对象。
猜你喜欢
- 2024-10-08 Java核心知识 基础六 JAVA序列化(创建可复用的Java对象)
- 2024-10-08 java中的序列化(JAVA中的序列化)
- 2024-10-08 Java 面试题之 序列化和反序列化的深入理解
- 2024-10-08 Oracle:Java 的序列化就是个错误,我们要删掉它!
- 2024-10-08 java序列化和反序列化实例详解(java序列化和反序列化实例详解区别)
- 2024-10-08 java对象序列化(java对象序列化到文件)
- 2024-10-08 实战案例:轻松搞定Java两种序列化机制
- 2024-10-08 java序列化机制之protobuf(快速高效跨语言)
- 2024-10-08 Java路径-40-Java序列化(未检测到java sdk环境请在配置中添加sdk安装路径)
- 2024-10-08 java序列化知多少(java序列化怎么实现)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)