Java-序列化是什么?哪里有应用?

文章目录

  • 什么是Java序列化?
    • 序列化特征
    • 序列化机制
  • 为什么需要Java序列化?
  • 如何使用Java序列化?
    • 网络编程中Java序列化的应用
  • Where
  • When
  • How
  • Java序列化和反序列化的表格
  • 总结

什么是Java序列化?

Java序列化是将Java对象转换为字节流的过程,以便在网络上传输、在文件中存储或在内存中保存。Java序列化可实现对象的持久化存储,即使应用程序关闭,对象也可以保留在内存中。

序列化特征

序列化是将内存中的对象转换成字节流的过程,以便在网络上传输或者持久化存储。
序列化可以跨平台使用,即不同编程语言可以对序列化数据进行解析和使用。
序列化过程中需要考虑对象的结构、属性等信息,以便在反序列化的时候能够正确地还原对象。

序列化机制

Java中的序列化机制:Java提供了Serializable接口和Externalizable接口,通过实现这两个接口,Java对象可以以二进制流的形式进行序列化和反序列化。
JSON序列化机制:JSON是一种轻量级的数据交换格式,支持序列化常见的数据类型,可以被多种编程语言解析和使用。
XML序列化机制:XML也是一种常见的序列化机制,支持序列化复杂的数据结构,但相对JSON而言,XML的解析和使用相对繁琐,性能也相对较低。
Protobuf序列化机制:Protobuf是Google开发的一种高效的数据序列化协议,具有压缩效率高、解析速度快等优点,被广泛应用于大规模数据序列化和网络传输场景。

为什么需要Java序列化?

Java序列化可用于在不同Java虚拟机之间传输对象。这对于分布式应用程序非常有用。另外,序列化还可以用于将Java对象保存在文件或数据库中。

如何使用Java序列化?

Java序列化需要实现Serializable接口。该接口是一个标记接口,不包含任何方法。只有实现了该接口的对象才能进行序列化和反序列化。

下面是一个Java序列化的示例代码:

import java.io.*;public class SerializationDemo implements java.io.Serializable {public String name;public String address;public transient int SSN;public int number;public void mailCheck() {System.out.println("Mailing a check to " + name + " " + address);}
}public class SerializeDemo {public static void main(String [] args) {SerializationDemo emp = new SerializationDemo();emp.name = "John Doe";emp.address = "123 Main St.";emp.SSN = 11122333;emp.number = 101;try {FileOutputStream fileOut =new FileOutputStream("/tmp/employee.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(emp);out.close();fileOut.close();System.out.printf("Serialized data is saved in /tmp/employee.ser");} catch (IOException i) {i.printStackTrace();}}
}public class DeserializeDemo {public static void main(String [] args) {SerializationDemo emp = null;try {FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");ObjectInputStream in = new ObjectInputStream(fileIn);emp = (SerializationDemo) in.readObject();in.close();fileIn.close();} catch (IOException i) {i.printStackTrace();return;} catch (ClassNotFoundException c) {System.out.println("SerializationDemo class not found");c.printStackTrace();return;}System.out.println("Deserialized Employee...");System.out.println("Name: " + emp.name);System.out.println("Address: " + emp.address);System.out.println("SSN: " + emp.SSN);System.out.println("Number: " + emp.number);}
}

该示例代码中,SerializationDemo类实现了Serializable接口,SerializeDemo类将对象进行序列化,并将其保存在/ tmp / employee.ser文件中。DeserializeDemo类从文件中读取序列化的对象,并对其进行反序列化。

网络编程中Java序列化的应用

在网络编程中,Java序列化可以用于客户端和服务器之间的数据传递。以下是一个简单的示例代码:

服务器端代码:

import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(8888);Socket socket = serverSocket.accept();ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream());ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream());Person person = (Person) inStream.readObject();System.out.println("Received: " + person.toString());person.setAge(25);outStream.writeObject(person);System.out.println("Sent: " + person.toString());serverSocket.close();} catch (Exception e) {e.printStackTrace();}}
}

客户端代码:

import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) {try {Socket socket = new Socket("localhost", 8888);ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream());ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream());Person person = new Person("Alice", 20);System.out.println("Sent: " + person.toString());outStream.writeObject(person);person = (Person) inStream.readObject();System.out.println("Received: " + person.toString());socket.close();} catch (Exception e) {e.printStackTrace();}}
}

其中,Person类是一个简单的JavaBean,用于存储人员信息:

import java.io.Serializable;public class Person implements Serializable {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString() {return "Person{name=" + name + ",age=" + age + "}";}
}

运行前先在终端输入:

javac Server.java
javac Client.java

然后运行服务器和客户端代码:

java Server
java Client

输出结果如下:

Sent: Person{name=Alice,age=20}
Received: Person{name=Alice,age=20}
Sent: Person{name=Alice,age=25}

可以看到,客户端将一个Person对象序列化后发送给服务器,服务器接收到该对象并打印输出。然后服务器将该对象的年龄修改为25后,将修改后的Person对象序列化后返回给客户端,客户端接收到该对象并打印输出。

Where

Java序列化可在任何Java应用程序中使用,包括Web应用程序和桌面应用程序。

When

Java序列化可在需要将对象保存在文件或数据库中或在网络传输时使用。

How

实现Serializable接口并使用ObjectOutputStream和ObjectInputStream进行序列化和反序列化操作。

Java序列化和反序列化的表格

下面是Java序列化和反序列化的表格:

序列化反序列化
ObjectOutputStream 对象输出流ObjectInputStream 对象输入流
序列化基本数据类型和对象反序列化基本数据类型和对象
写入 writeObject 方法读取 readObject 方法
序列化过程可以重写反序列化过程可以重写
序列化顺序按照写入顺序反序列化顺序按照读取顺序
序列化的字节流可以存储反序列化的字节流可以从文件或网络中读取
序列化的结果可以传输到网络反序列化结果可以从网络中读取或者从本地文件中读取

以上的表格列举了Java序列化和反序列化的一些特点和区别。在序列化过程中,需要使用 ObjectOutputStream 对象输出流将Java对象转化为字节流,而在反序列化过程中,需要使用 ObjectInputStream 对象输入流将字节流转换回Java对象。在序列化和反序列化过程中都可以重写相应的方法以实现自定义的序列化和反序列化逻辑。序列化和反序列化的顺序也需要保持一致,否则反序列化可能会出现异常。

总结

Java序列化是将Java对象转换为字节流的过程。它可用于在不同的Java虚拟机之间传输对象,或将Java对象保存在文件或数据库中。Java序列化需要实现Serializable接口,该接口是一个标记接口。序列化可以通过ObjectOutputStream和ObjectInputStream类实现。Java序列化是免费的,没有任何成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147480.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大数据Flink(九十五):DML:Window TopN

文章目录 DML:Window TopN DML:Window TopN Window TopN 定义(支持 Streaming):Window TopN 是一种特殊的 TopN,它的返回结果是每一个窗口内的 N 个最小值或者最大值。 应用场景

zemax场曲/畸变图与网格畸变图

网格畸变是XY两个方向上的几何畸变,是不同视场实际像高与近轴像高的偏差。 垂轴放大率在整个视场范围内不能保持常数 当一个有畸变的光学系统对一个方形的网状物体成像时,若δy>0,则主光线的交点高度y比理想像高y低,视场越大,低得越多&a…

Apache Derby的使用

Apache Derby是关系型数据库,可以嵌入式方式运行,也可以独立运行,当使用嵌入式方式运行时常用于单元测试,本篇我们就使用单元测试来探索Apache Derby的使用 一、使用IDEA创建Maven项目 打开IDEA创建Maven项目,这里我…

ESP32设备驱动-OLED-SSD1306(I2C)显示屏驱动

OLED-SSD1306(I2C)显示屏驱动 1、OLED介绍 OLED显示屏是指有机电激发光二极管(OrganicLight-EmittingDiode,OLED)由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一…

Vue3切换路由白屏刷新后才显示页面内容

问题所在: 1.首先检查页面路由以及页面路径配置是否配置错误。 2.如果页面刷新可以出来那证明不是配置的问题,其次检查是否在根组件标签最外层包含了个最大的div盒子包裹内容。(一般vue3是可以不使用div盒子包裹的) 3.最后如果…

无线WIFI工业路由器可用于楼宇自动化

钡铼4G工业路由器支持BACnet MS/TP协议。BACnet MS/TP协议是一种用于工业自动化的开放式通信协议,被广泛应用于楼宇自动化、照明控制、能源管理等领域。通过钡铼4G工业路由器的支持,可以使设备间实现高速、可靠的数据传输,提高自动化水平。 钡…

ARMday2

1~100累加 代码 .text .globl _start _start:mov r0, #1 fun:cmp r0,#100addls r1,r1,r0addls r0,r0,#1b fun .end运行结果

macOS 14 Sonoma 如何删除不需要的 4k 动态壁纸

概览 在升级到 macOS 14(Sonoma)之后,小伙伴们惊喜发现  提供了诸多高清(4k)动态壁纸的支持。 现在,从锁屏到解锁进入桌面动态到静态的切换一气呵成、无比丝滑。 壁纸显现可谓是有了“天水相连为一色&…

list(链表)

文章目录 功能迭代器的分类sort函数(排序)merage(归并)unique(去重)removesplice(转移) 功能 这里没有“[]"的实现;原因:实现较麻烦;这里使用迭代器来实…

c语言 - 实现每隔1秒向文件中写入当前系统时间

实现思路 主要是通过库函数和结构体获取当前系统时间(年月日和时分秒)保存到变量里,然后通过格式化输出函数将当前系统时间输出到文件中去。 但是需要注意的是题目要求每隔 1 s对系统时间进行输出,所以需要加入 sleep()函数进行调…

设计模式10、外观模式Facade

解释说明:外观模式(Facade Pattern)又称为门面模式,属于结构型模式 Faade 为子系统中的一组接口提供了一个统一的高层接口,该接口使得子系统更加容易使用 外观(Facade)角色:为多个子系统对外提供…

学信息系统项目管理师第4版系列15_资源管理基础

1. 项目资源 1.1. 实物资源 1.1.1. 着眼于以有效和高效的方式,分配和使用完成项目所需的实物资源 1.1.2. 包括设备、材料、设施和基础设施 1.2. 团队资源 1.2.1. 人力资源 1.2.2. 包含了技能和能力要求 2. 人力资源管理 2.1. 不仅是组织中最重要的资源之一&…

科技资讯|AirPods Pro基于定位控制的自适应音频功能

在接受 TechCrunch 媒体采访时,苹果高管 Ron Huang 和 Eric Treski 谈到了关于 AirPods Pro 自适应音频(Adaptive Audio)功能的轶事,曾考虑基于 GPS 信号来控制自适应音频级别。 Treski 表示在探索自适应音频功能初期&#xff0…

【C++进阶之路】C++11(上)

文章目录 一、列表初始化1.{}2.initializer_list 二、声明1.auto2.deltype 三、右值与左值1.基本概念2.应用场景1.左值引用2.右值引用3.完美转发4.万能引用 四、新增默认成员函数五、lambda表达式1.基本语法1.1捕捉列表1.2参数列表1.3返回类型1.4函数体 2.底层原理 总结 一、列…

【Redis】五大数据类型 、历史概述、nosql分类

文章目录 NoSql概述NoSql年代缓存 Memcached MySQL垂直拆分(读写分离)分库分表水平拆分Mysql集群最近为什么要用 NoSqlNoSql的四大分类 Redis测试性能 五大数据类型keyStringSetHashZset 前言:本文为看狂神视频记录的笔记 NoSql概述 NoSql年…

nodejs开发环境搭建

Nodejs是一个开源的、跨平台JavaScript运行时环境,其使用V8引擎对JavaScript脚本执行解释,在前后端分离的应用架构设计中,其既能支持web页面服务应用的开发、也能支持后端接口服务应用的开发,类似于Java语言的J2EE运行时环境&…

stm32 - GPIO

stm32 - GPIO GPIO结构图GPIO原理图输入上拉/下拉/浮空施密特触发器片上外设 输出推挽/开漏/关闭输出方式 GPIO88种模式复用输出 GPIO寄存器端口配置寄存器_CRL端口输入数据寄存器_IDR端口输出数据寄存器_ODR端口位设置/清除寄存器_BSRR端口位清除寄存器_BRR端口配置锁定寄存器…

ElementUI之CUD+表单验证

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 生活的理想,为了不断更新自己 ! 1.前言 首先,Vue是一种流行的JavaScript框架,它提供了一种简洁易用的方…

UGUI交互组件Button

一.初识Button对象 从菜单中创建Button对象,Button的文本由子节点Text对象显示,Button对象的组件除了基础组件外,还有Image用来显示Button常规态的图片,还有Button组件用来控制点击过渡效果和点击事件的响应。 二.Button组件的属…

POJ 3109 Inner Vertices 离散化+树状数组

一、题目大意 围棋棋盘,如果某个坐标上下左右的四个方向都存在棋子,那么ans1,根据输入的棋子数量,求出ans的数量。 二、解题思路 题目中有说到如果程序不会结束,那么输出-1,这其实是无源之水&#xff0c…