为什么Java需要对象的序列化

简介: 为什么Java需要对象的序列化

1,什么是序列化


序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。


2,Java的序列化


将JOPO转换成字节流


3,Java序列化的意义(为什么需要序列化)


将对象流化,更易在信道上传输或者保存在文件中

网络基础结构和硬盘这些硬件组件能够理解bits和bytes,但不了解Java对象

这类似于语音通过PSTN电话线传输的原理


4,形象例子


经过多年的努力,地球科学家开发出一种可以帮助他们日常工作的机器人。但是这个机器人的功能比火星行星科学家开发的机器人要少。

在两个行星的科学家会面后,火星将用飞船他们的机器人送到地球。但是问题来了。向地球发送100台机器人的费用为1亿美元。旅行大约需要60天。

最后,火星的科学家决定与地球科学家分享他们的秘密。这个秘密是关于机器人(类比Java中的class)的结构。地球科学家在地球上开发了相同的结构。 火星的科学家将每个机器人的数据序列化并将其发送到地球。地球科学家对数据进行反序列化并相应地将其输入给每个机器人。这个过程节省了他们传递大量数据的时间。

一些机器人被用于火星上的一些防御工作。因此,在将数据发送到地球之前,将这些机器人的一些重要特性标记为瞬态。请注意,在对象进行反序列化时,瞬态属性设置为null(在引用的情况下)或默认值(在基本类型的情况下)。

地球科学家注意到的另一点是,火星的科学家要求他们创建一些静态变量来保存环境细节。一些机器人使用这些细节。但是火星的科学家并没有分享这些细节。因为地球的环境与火星的环境不同。即使了解机器人类结构并具有序列化数据,地球科学家也无法对可以使机器人工作的数据进行反序列化。


Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:

火星的科学家们正在等待全部付款。 付款完成后,再与地球科学家分享了serialversionUID。 地球科学家把它设置为机器人类,一切都开始工作了。


PS:

虽然在序列化的帮助下,他们能够使用信号而不是实际的太空船发送数据,他们意识到发送大量数据仍然是一个挑战。 序列化使流程更便宜,更快,但仍然很慢。 因此,不同的科学家提出了不同的想法来减少数据量。 一些科学家建议压缩数据,有些建议使用不同的机制来表示它,以便可以反序列化。比如XMLJSONmsgpack等。


5,应用


保存数据以供日后使用。例如,假设您正在编写视频游戏。你的程序不会永远运行;即使它永远不会崩溃(希望是这种情况),用户可能会在某个时刻退出程序,或者操作系统可能会终止程序以节省资源(例如,在Android上,用户未与之交互的后台进程经常并故意被操作系统杀死以回收RAM等系统资源。为了确保用户从一开始就没有启动,而是可以从最近的保存点恢复,需要将游戏状态写入持久存储(即硬盘驱动器,用户的Google云端硬盘帐户等)。为此,需要将表示游戏状态的内存中的数据结构转换为可写入磁盘的原始字节(或者保存数据的任何系统)。

从远程服务器取回信息。继续游戏示例…假设正在创建一个在线多人游戏,或者能够在游戏中提供新级别或项目而无需用户更新其应用程序。为此,从服务器计算机(用作各种设备上安装的应用程序的所有副本的联系点)传达有关在线播放器的信息或有关新级别/项目的信息到应用程序的各个副本。服务器和应用程序都需要这些数据结构的某种内存表示(例如,其他玩家的位置,新级别的结构,新项目的描述/图像等),但是要传输信息从服务器到设备上的应用程序,通信系统由原始字节组成,因此有必要将数据转换为原始字节并将原始字节转换回有意义的内存数据结构。


相关文章
|
1天前
|
安全 Java 数据安全/隐私保护
Java 封装:对象的“面纱”下,隐藏着怎样的世界?
【6月更文挑战第15天】Java封装是对象的隐私保护,它隐藏类的内部细节并设定访问接口。`Person`类展示了如何用`private`字段和公共getter/setter方法实现封装,确保数据安全性和代码可维护性。例如,`BankAccount`类封装了余额,只允许通过`deposit`、`withdraw`和`getBalance`方法操作。封装减少了外部干扰,增强安全性,提高可扩展性,是Java面向对象编程的核心原则之一。
|
1天前
|
安全 Java 数据安全/隐私保护
揭秘 Java 的“心灵封印术”:如何巧妙隐藏对象的小秘密?
【6月更文挑战第15天】Java的封装是面向对象的核心,它隐藏对象内部细节,只暴露必要的接口。比如`Student`类中,私有属性`name`和`age`通过公共方法访问,保证数据安全。同样,`BankAccount`类封装`balance`,仅允许通过`deposit`、`withdraw`和`getBalance`操作,防止数据误改。封装使代码更健壮、易维护,是编程的强力工具。
|
1天前
|
Java 开发者
Java 面向对象编程实战:从类定义到对象应用,让你成为高手!
【6月更文挑战第15天】在Java中,掌握面向对象编程至关重要。通过创建`Book`类,展示了属性如`title`和`author`,以及构造方法和getter方法。实例化对象如`book1`和`book2`,并访问其属性。进一步扩展类,添加`pages`和`calculateReadingTime`方法,显示了类的可扩展性。在更大规模的项目中,如电商系统,可以定义`Product`、`User`和`Order`类,利用对象表示实体和它们的交互。实践是精通Java OOP的关键,不断学习和应用以提升技能。
|
1天前
|
Java 开发者
为什么 Java 的类和对象如此重要?看完这篇你就懂了!
【6月更文挑战第15天】在Java中,类和对象是核心概念。类作为蓝图定义数据(如角色的名称和健康值)和行为(如`takeDamage`方法),而对象是类的实例,允许交互(如战士受伤)。通过继承,如`Circle`和`Rectangle`扩展`Shape`类,实现多态性,增强代码灵活性。类和对象促进代码组织、复用和可维护性,是高效软件开发的基础。
|
1天前
|
设计模式 Java
一文掌握 Java 面向对象精髓:从类定义到对象实战
【6月更文挑战第15天】Java面向对象编程初学者指南:类是对象模板,如`Person`类含`name`和`age`属性。创建对象用`new`,如`Person person = new Person()`。访问属性如`person.name="Alice"`,调用方法如`person.sayHello()`。类能继承,如`Student extends Person`。对象间共享数据可传参或共用引用。多态性允许父类引用调用子类方法。注意对象生命周期和内存管理,避免内存泄漏。通过实践和理解这些基础,提升编程技能。
|
1天前
|
安全 Java
Java 对象创建与使用:你真的会用吗?
【6月更文挑战第15天】在Java中,对象创建涉及`new`关键字和构造器,用于初始化。使用对象时注重属性和方法的访问,遵循命名规范。关注对象生命周期,避免过度创建,如在循环内,以减少内存消耗和提高性能。还要考虑线程安全,尤其在多线程环境下,确保正确同步以防止数据不一致。通过优化对象的创建与使用,提升代码效率和可靠性。
|
1天前
|
Java
别再被 Java 类和对象绕晕了!一篇文章让你秒懂!
【6月更文挑战第15天】Java中的类是对象的模板,定义属性(如姓名、年龄)和行为(如走路、说话)。对象是类的实例,有自己的属性值。例如,`Person`类可创建`Person`对象,赋予属性值并调用方法。同样,`Car`类可创建不同品牌的汽车对象,每个对象能加速或刹车。理解类与对象的关系是Java面向对象编程的基础。
|
1天前
|
Java
Java 小白也能看懂!类和对象详解,轻松入门面向对象编程
【6月更文挑战第15天】面向对象编程对新手可能抽象,但理解Java中的类和对象是关键。类是事物模板,如“汽车”类包含属性(颜色、型号、速度)和行为(启动、加速、刹车)。对象是类的实例,像具体的汽车。通过创建对象并调用其方法,可以模拟现实世界的情景。例如,`Car myCar = new Car();`创建了一个汽车对象,之后可设置属性和调用方法。多练习有助于掌握这一概念。
|
1天前
|
Java
Java 面向对象编程:你真的懂类和对象吗?
【6月更文挑战第15天】Java的面向对象编程聚焦于类与对象。类是共享属性和行为的抽象,如`Person`类含名字和年龄。对象是类的具体实例,如`person1`和`person2`各有独特的属性值。设计类时要考虑扩展性,以便适应变化,如添加“性别”属性。对象管理涉及保持其状态和行为的正确性。继承允许类如`Student`扩展`Person`,增加新特性。理解面向对象不仅是创建和使用,更是关于设计和架构的智慧。
|
1天前
|
Java
从 0 到 1,Java 对象创建的神秘面纱终于被揭开!
【6月更文挑战第15天】Java对象创建始于类定义,如`Person`或`Student`。使用`new`关键字在堆内存中分配空间并调用构造器初始化属性。这允许实例化具有特定行为的个体,参与程序中的交互。继承使子类如`Student`扩展父类`Person`的功能。对象创建是构建程序基础的关键步骤,将抽象概念转化为可操作的代码对象。