对象的串行化(Serialization)和反串行化(deserialization)

串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象,[color=red]打回原形[/color]。
一、串行化的意义:
1:解决Web应用程序的无状态弊端
一旦将某一对象串行化,得到的字节可以存储在文件、数据库,或内存中—— 只要是可以存储的任何地方。需要恢复对象时,仅仅只需从它存储的位置反串行化即可。对象固有的这种特性对于无状态的Web应用程序是非常重要的,因为它允许重要的状态信息可以在用户请求之间保留。
2:应用程序边界之间传递对象
串行化也允许对象在应用程序边界之间传递,编程人员可以将描述对象状态的字节流在网络上传递,并在另一端反串行化成一个匹配的对象。从本质上讲,串行化允许对象以“数值”的方式传递给另一个应用程序。
二:串行化对象
在java中串行化对象必须:
1、该对象的类必须实现Serializable接口
2、该对象的串行化成员必须是非静态成员变量,即不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。而对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明 。
[color=red]注:保存任何的成员方法和静态的成员变量没有任何的意义,因为,对象的类已经完整的保存了他们,如果再串行化他们还有什么意义呢?呵呵[/color]
3、要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。
三:具体实现
1、[color=red]串行化的对象:Person类[/color]

import java.io.Serializable;
/*
* time:2008-07-19
* author:coke
*/

/*
*必须实现Serializable
*/
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private int age; // will persist
private String name; // will persist
// transient 为Java保留字,告诉JVM以transient宣告的基本型态(primitive type)或物
// 件(object)变量不要序列化,例如敏感性数据像是密码等。
private transient String pwd; // will not persist
public Person() {
}

public Person(int age, String name,String pwd) {
this.age = age;
this.name = name;
this.pwd=pwd;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}
}

2、[color=red]串行化和反串行化[/color]

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
/*
* time:2008-07-19
* author:coke
*/
public class TestSerializable {
private static File f = null;

//串行化
public static void serialization() {
f = new File("D://t.m");
try {
if (f.exists())
f.delete();
f.createNewFile();

} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Person p = new Person(10, "xplq", "123456");
try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(f));
out.writeObject(p);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//反串行化
public static void deserialization() {
if (!f.exists())
return;
try {
ObjectInputStream input = new ObjectInputStream(
new FileInputStream(f.getPath()));
try {
Person p = (Person) input.readObject();
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getPwd());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//测试
public static void main(String[] args) {
TestSerializable.serialization();
TestSerializable.deserialization();
}

}

3.测试结果
xplq
10
null
因为pwd transient ,不能被串行化
InsecureDeserialization(不安全的反序列化) 什么是反序列化? 有些时候我们需要把应用程序中的数据以另一种形式进行表达,以便于将数据存储起来,并在未来某个时间点再次使用,或者便于通过网络传输给接收方。这一过程我们把它叫做序列化。典型的例子是,用户数据被序列化后存储到数据库中,另一个例子是在Stateless架构下,用户登陆后的身份数据被序列化存储到了浏览器中。 反序列化序列化是两个正好相反的过程。当我们要再次使用这些数据的时候,应用程序读... 阅读详情

相关推荐

Java实习生常规技术面试题每日十题Java基础(三)(1)

1、抽象类里面可以用普通方法,而接口中的方法全部都是抽象的;2、在应用范围上来说,接口往往在程序设计的时候,用来定义程序模块的功能,方便各模块协同工作;抽象类是对相似类进行抽象,形成一个抽象的父类可供重用!

2401_83412172的博客 355

理解Java里面的序列化反序列化

(一)什么是序列化反序列化 序列化(serialization反序列化(deserialization)是将对象转化成字节数组以方便保存或者用于网络传输,这个对象可以是一个图片,一个字符串,一个class等等,常见序列化格式有字节数组,json格式,xml格式,更加高效的有google开源的Protocol Buffers,以及Apache Avro。 (二)为什么需要序...

三劫散仙 274

Deserialization反序列化漏洞

详细介绍反序列化安全漏洞的知识笔记。绝佳的入门教程+配套靶场

Eason_LYC安全白帽子的成长博客 3459

什么是序列化?什么是反序列化?

Java 中,

m0_69529796的博客 1403

Java 反序列化

反序列化基础 Java 的序列化(Serialization反序列化(Deserialization)是将对象的状态转换为字节流并恢复的过程。这个过程使对象可以保存到文件、通过网络传输或保存到数据库中,并在稍后恢复成对象。 序列化(Serialization):将 Java 对象的状态转换为字节流的过程。这使得对象可以保存到文件、发送到其他 JVM 甚至通过网络传输。 反序列化(Deserialization):将字节流转换回 Java 对象的过程。这允许恢复先前序列化的对象状态。 序列化条件 要使

sky123博客 3806

2.对象串行化(Serialization)反串行化(deserialization)

[quote]串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象,打回原形。 一、串行化的意义: 1:解决Web应用程序的无状态弊端 一旦将某一对象串行化,得到的字节可以存储在文件、数据库,或内存中—— 只要是可以存储的任何地方。需要恢...

chenqqabcdchenqqabcd的专栏 323

也说C#串行化

概述: 串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象。初听起来可能对此不太感兴趣,但是使用串行化却有许多重要的原因。一旦将某一对象串行化,得到的字节可以存储在文件、数据库,或内存中——只要是可以存储的任何地方。需要恢复对象时,仅仅只需...

weixin_30823683的博客 83

Java实习生常规技术面试题每日十题Java基础(三)

OverloadOverride的区别。参数列表相同,返回值不同的方法,是否是重载方法?接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)?面向对象有哪三大特性?abstract classinterface有什么区别?如何理解Java中的SerializationDeserialization。String是最基本的数据类型吗?如何实现字符串的反转及替换。String("xyz");创建了几个字符串对象

杨明金的博客 1万+

java 序列化

Java序列化Serialization:是一种将对象转化成流的过程;Java反序列化deserialization:是一种将流转化成对象的过程。 序列化的必要性     Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。 需要序列化的情况     当你想把的内存中的对象保存到一个文件中或者数据库中时候

码小农 506

解释Java中的序列化(Serialization)与反序列化(Deserialization

Java 中,序列化(Serialization)是将对象的状态转换为可以保存或传输的格式的过程,然后可以通过反序列化(Deserialization)将这种格式恢复为对象。序列化在多种场景中非常有用,比如将对象保存到文件系统中、通过网络发送对象等。

java永无止境! 1899

SerializationDeserialization

SerializationDeserialization Java提供了一种叫做对象序列化的机制,他把对象表示成一连串的字节,里面包含了对象的数据,对象的类型信息,对象内部的数据的类型信息等等。因此,序列化可以看成是为了把对象存储在磁盘上或者是从磁盘上读出来并重建对象而把对象扁平化的一种方式。反序列化是把对象从扁平状态转化成活动对象的相反的步骤。 ...

weixin_41924879的博客 1669

反序列化漏洞详解

一、反序列化漏洞原理 1、相关概念 序列化(Serialization):将对象的状态信息转换为可以存储或传输的形式的过程,一般将对象转换为字节流。序列化时,对象的当前状态被写入到临时或持久性存储区。 反序列化(Deserialization):从序列化的表示形式中提取数据,即把有序字节流恢复为 2、序列化出现场景 ●远程进程间通信(RPC/IPC) ●连线协议、Web服务、消息代理 ●缓存/持久性 ●数据库、缓存服务器、文件系统 ●HTTP cookie、HTML表单参数、API身份验

xcxhzjl的博客 1万+

Java序列化与反序列化:从原理到实战,一文彻底搞懂!

把内存中的Java对象转换成二进制字节流,以便保存到文件或通过网络发送。// 先序列化默认字段// 自定义加密或额外写入// 先反序列化默认字段// 自定义解密这种模式常用于加密敏感字段或兼容新旧版本。序号建议内容①所有可序列化类都应显式声明②敏感字段使用transient修饰,并在中加解密③不要序列化static字段,它们不属于对象状态④版本迭代时,注意兼容旧版本的⑤大对象或高频场景,优先考虑 Protobuf 等高性能方案⑥生产环境务必配置防止反序列化攻击序列化。

✨ 欢迎来到【Seal ^_^ 的CSDN博客】!✨ 457

深入探究序列化与反序列化:原理、应用最佳实践

序列化(Serialization)是指将对象转化为字节流的过程,以便于存储或通过网络进行传输。反序列化(Deserialization)则是将字节流转化为对象的过程,恢复原始对象的状态。在计算机科学中,序列化反序列化是常用的数据处理技术,用于在不同系统、不同编程语言之间传递对象或持久化对象的状态。

唯有努力,方可自信! 1万+

Java 序列化与反序列化机制及自定义序列化实现

定义接口提供完全控制序列化过程。实现// 忽略敏感字段public Order() {} // 必须提供无参构造器@Override@Override优点完全控制字段序列化。性能高(无反射)。缺点需手动实现所有字段。维护复杂。定义:在类中定义特定方法,控制序列化。实现// 默认序列化非 transient 字段// 附加数据// 默认反序列化// 读取附加数据优点灵活,结合默认序列化。维护简单。缺点仍依赖反射,性能略低于。

lssffy的博客 1268

反序列化(Deserialization

术语含义示例序列化把对象转成字节流或字符串反序列化把字节流或字符串还原为对象加载之前保存的向量数据库(如 FAISS)加载页码信息(如实现知识库的持久化复用这样可以在不同会话之间保留数据,提高效率。预告下,下篇更新Native RAG 入门,喜欢的小伙伴点点关注哈。

2403_87956061的博客 463

【超详细讲解】什么是序列化反序列化?

序列化是将对象的状态转换为可存储或可传输格式的过程。对象在内存中一般以特定的数据结构(指针、引用、哈希表、链表等)存在,直接传输内存数据是不可靠的(不同机器架构不同、数据对齐不同、指针无意义等问题)。所以我们需要将对象转换成连续的字节流(或标准格式的文本),使得:可以写入磁盘文件可以通过网络发送到远端可以被其他进程或设备正确解析简单来说,序列化是让数据“离开内存,去旅行”的必备装备。反序列化就是序列化的逆过程。把收到的字节流或文本格式数据,还原成内存中的对象或数据结构,供程序继续操作。

Python84310366的博客 1463

Java基础练习选择题(1)答案

JDK是( )   A、一种全新的程序语言   B、一种程序开发辅助工具   C、一种由Java写成的,并支持Java Applet的浏览器   D、一种游戏软件  2、Java语言中下面哪个可以用作正确的变量名称( )   A、3D       B、name      C、extends     D、implements 3、构造函数何时被调用( )      A

coding1994的博客 7万+

java负责读写的两个类分别,本科Java题库

2.能否将一个对象写入一个随机访问文件?3.BufferedReader流能直接指向一个文件对象吗?为什么? 4.字节流字符流之间有什么区别?5.简述可以用哪几种方法对文件进行读写。6.从字节流到字符流的转化过程中,有哪些注意事项? 二、选择题1.实现字符流的写操作类是( B ),实现字符流的读操作类是( A )。 A.FileReader B.Writer C.Fil...

weixin_36364419的博客 771
上一篇: 对象的串行化(Serialization)
下一篇: 资源获取完整总结
xinking520
博客等级 码龄15年 0粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值