对象的序列化 之 对象持续性

深入底层---字节Android高级岗:-Activity间传递对象为什么要序列化?序列化有哪几种方式?它们有什么区别? 我们都知道进行Android 开发的时候,跳转到Activity和Fragment的时候,传递对象是通过Intent或者bundle 进行传递。当这个对象没有实现序列化的时候 当你通过Inetnt传递的时候会报红,系统会提示你将这个对象实现序列化。不同 Activity 之间传输数据可以通过Intent对象的putExtra。 阅读详情

对象持续性

      在我写的Java学习之对象序列化(一)中您已经知道了序列化机制的一些含义和如何实现序列化,在本文中我们将深入到该机制的内部看看它到底是怎么工作的!

举个例子来说:

       假设现在写好了两个类,一个Employee(员工类),一个Manager(经理类),接着创建它们的对象,在创建Manager对象时需要为 Manager指定一个秘书而秘书也是一个Employee,在这里我们就用现成的Employee对象做Manager的秘书,也就是说需要在 Manager中包含一个Employee的对象引用,如下代码:

Employee harry = new Employee("Harry Hacke",.........);  //是员工又是秘书

Manager manager1 = new Manager("Tony Tester",.......);  //经理对象

manager1.setSecretary(harry);   //设置秘书为harry

现 在,在内存中实际创建了两个对象,一个Employee,一个Manager而Manager中包含了一个指向Employee对象的引用,是引用而已, 当我们把以上这些写入磁盘的时候发生了变化,harry的数据被保存了两次,也就是说我们在Manager中获得了harry对象的完整拷贝,这当然不是 我们想看到的,比如我们要给harry加薪,当然不希望还要搜索该对象的其他全部拷贝,换言之我们希望磁盘上的对象布局和内存中的对象布局保持完全的一 致。这就是“对象持续性”!

      你可能会想到可以保存“秘书”对象的内存地址,不行的,因为,每一次加载对象都可能使用和原来截然不同的内存地址!

      不过,现在好了,Java解决这个问题的办法就是采用序列化机制,下面是序列化具体的算法:

1.保存到磁盘的所有对象都获得一个序列号(1,2,3等等)

2.当要保存一个对象时,先检查该对象是否已经保存过。

3.如果以前保存过,只需写入“与已经保存的具有序列号x的对象相同”标记;否则,保存该对象。

通过以上的步骤不久解决了“对象持续性”的问题了!

看个例子吧!(在JDK1.4下调试通过)

import java.io.*;
import java.util.*;

public class ObjectRefTest
{
    public static void main(String[] args)
    {
        Employee harry = new Employee("Harry Hacker", 50000);
        Manager manager1 = new Manager("Tony Tester", 80000);
        manager1.setSecretary(harry);
       
        Employee[] staff = new Employee[2];
       
        staff[0] = harry;
        staff[1] = manager1;
        try
        {
            ObjectOutputStream out = new ObjectOutputStream(
                new FileOutputStream("employee.dat"));
            out.writeObject(staff);
            out.close();
           
            ObjectInputStream in = new ObjectInputStream(
                new FileInputStream("employee.dat"));
            Employee[] newStaff = (Employee[])in.readObject();
            in.close();
   
            /**
             *通过harry对象来加薪
             *将在secretary上反映出来
             */
            newStaff[0].raiseSalary(10);
           
            for (int i = 0; i < newStaff.length; i++)
                System.out.println(newStaff[i]);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
   
}

class Employee implements Serializable
{
    public Employee() {}
   
    public Employee(String n, double s)
    {
        name = n;
        salary = s;
    }
   
    /**
     *加薪水
     */
    public void raiseSalary(double byPercent)
    {
        double raise = salary * byPercent / 100;
        salary += raise;
    }
   
    public String toString()
    {
        return getClass().getName()
            + "[name = "+ name
            + ",salary = "+ salary
            + "]";
    }
   
    private String name;
    private double salary;
    private Date hireDay;
   
}

class Manager extends Employee
{
    public Manager(String n, double s)
    {
        super(n, s);
        secretary = null;
    }
   
    /**
     *设置秘书
     */
    public void setSecretary(Employee s)
    {
        secretary = s;
    }
   
    public String toString()
    {
        return super.toString()
            + "[secretary = "+ secretary
            + "]";
    }
   
    //secretary代表秘书
    private Employee secretary;
   
}

以上都是序列化默认的行为,实际编程中我们还会遇到许多情况导致序列化的默认行为出错。 
Binder相关面试总结(五):为什么Activity间传递对象需要序列化 1. 什么是序列化序列化– 将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。简单来说:序列化:把对象转换为字节序列的过程称为对象的序列化。反序列化:把字节序列恢复为对象的过程称为对象的反序列化。2. 为什么要序列化序列化的原因基本三种情况:永久性保存对象,保存对象的字节序列到本地文件中;对象在网络中传递;对象在IPC间传递。3. Android中的两种序列化机制。 阅读详情

相关推荐

深入底层 | 字节Android高级岗: Activity间传递对象为什么要序列化?序列化有哪几种方式?它们有什么区别?

前言 我们都知道进行Android 开发的时候,跳转到Activity和Fragment的时候,传递对象是通过Intent或者bundle 进行传递。当这个对象没有实现序列化的时候 当你通过Inetnt传递的时候会报红,系统会提示你将这个对象实现序列化。 不同 Activity 之间传输数据可以通过 Intent 对象的 putExtra 方法传递,对于 java 的八大基本数据类型(char int float double long short boolean byte)传递是没有问题的,但是如果传递.

chuhe1989的博客 1249

Java学习之对象序列化(二)

对象持续性       在我写的Java学习之对象序列化(一)中您已经知道了序列化机制的一些含义和如何实现序列化,在本文中我们将深入到该机制的内部看看它到底是怎么工作的! 举个例子来说:       假设现在写好了两个类,一个Employee(员工类),一个Manager(经理类),接着创建它们的对象,在创建Manager对象时需要为Manager指定一个秘书而秘书也是一个Employee,在这里

风帆的Blog 1781

49、虚拟世界体验保存与输入技术探索

本文探讨了虚拟世界体验的保存与输入技术,重点介绍了一种基于Unity3D的轻量级、可复用的虚拟世界回放系统,该系统通过序列化对象状态实现跨版本回放,具备低性能开销和高兼容性,并已作为开源项目发布。同时提出一种适用于消费者级VR设备的和弦键盘映射方案,利用现有控制器实现高效文本输入,支持盲打与学习辅助,拓展VR在教育、办公等领域的应用潜力。文章分析了两项技术的优势、挑战及社会影响,强调其在游戏、教学、研究等多场景的价值,并呼吁关注数据隐私与技术伦理,推动虚拟世界可持续发展。

z4a5b6的博客 55

对象流 序列化笔记

对象流 对象会在进程结束时,也结束掉 使用对象流,实现了对对象的长时间存储下来。 类似于 某天和某人合影,拍照,来纪念某天 对象的寿命会随着生成该对象的进程的终止而终止,有时需要把对象的状态保存下来,需要时再将对象回复。 把对象的这种能记录自己的状态以便将来再生的能录,叫做对象的持续性。 对象通过写出描述自己状态的数值来记录自己,这个过程叫做对象的序列化。 只有实现了序列化接口的...

xpj4657065的博客 131

Labview及NI-USRP驱动安装教程

软件下载 安装使用的LabVIEW2018及NI-USRP驱动程序已上传,下载地址: 天翼云盘链接 (访问码:oc33) 百度网盘链接 (提取码:88mi) (注:天翼云盘下载不限速) LabVIEW2018安装步骤 右键软件压缩包选择解压至LabVIEW2018 选中文件,鼠标右击选择以管理员身份打开2018LV-WinChn.exe文件。 点击确定。 点击Unzip解压。 点击确定。 点击下一步。 填写任意信息后,点击下一步。 点击下一步。 点击浏览更改安装路径建议安装到除C盘以

dadapongi6的博客 2万+

一文告诉你:如何在trae中编译运行STM32程序,并让AI帮你修改代码

本文详细介绍了如何将STM32程序从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 4883

(转自csdn)

 对象持续性      在我写的Java学习之对象序列化(一)中您已经知道了序列化机制的一些含义和如何实现序列化,在本文中我们将深入到该机制的内部看看它到底是怎么工作的!举个例子来说:      假设现在写好了两个类,一个Employee(员工类),一个Manager(经理类),接着创建它们的对象,在创建Manager对象时需要为Manager指定一个秘书而秘书也是一个Employee,在这里我们

OUPLUS的专栏 845

分辨率太小 / Retina 模糊 / 全屏异常:一篇解决 VMware Fusion + Kali 显示问题(Xfce & GNOME 通用)

本文提供了在Mac(尤其是Retina屏)上运行Kali Linux时常见显示问题的完整解决方案。主要解决三类问题:分辨率太小、Retina屏模糊和全屏异常。核心思路是先安装open-vm-tools-desktop并重启,这是90%问题的根源。然后根据不同问题分别处理:调整DPI/Scale解决字体大小,避免双重缩放导致的模糊,以及通过窗口拉伸和重启解决全屏异常。文章还给出了针对Xfce和GNOME的最佳配置建议,并强调调试完成后应创建快照以便快速恢复。最后提供了速查表,方便用户快速参考关键步骤。

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 874

理解hibernate中持久化和序列化

一、什么是序列化 对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值(serialVersionUID)来记录自己 ,这个过程叫对象的串行化(Serialization) 。串行化的主要任务是写出对象实例变量的数值以

纸上得来终觉浅 绝知此事要躬行 949

NuPlayer 之 Renderer

触发postDrainAudioQueue_l()或postDrainVideoQueue()开始渲染。解码器输出数据 → NuPlayer::Decoder::onMessageReceived。音频数据存入mAudioQueue,视频数据存入mVideoQueue。• 每次写入后通过mNotifyConsumed通知解码器。• 通过AudioSink::write()写入音频设备。• 根据VSync信号和音频时钟调整渲染时机。• 通过Surface直接提交给显示系统。

aningxiaoxixi的博客 309

最佳量化交易的计算机操作系统

本文在Creative Commons许可证下发布   我经常被问到的一个问题是:用哪种计算机操作系统和计算软件进行量化交易的理论研究和代码实现?   我想把这个问题简化,从挑选的计算软件和计算库来反推最佳使用的计算机操作系统。简而言之,就是在本文撰写的时候而言,如果你想进行基于任何严肃的数学理论和金融量化交易研究理论,这里特指机器学习或者深度学习。并且需要在本地研究机器上使用桌面版本,...

evilqliang的博客 2307

java串行化_Java 对象的串行化(Serialization)

1.什么是串行化对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization)。串行化的主要任务是写出对象实例变量的数值。如果变量是另一对象的引用,则引用的对象也要...

weixin_39721807的博客 152

DRV8311HRRWR直流无刷(BLDC)电机驱动原理图设计

DRV8311HRRWR集成三个MOSFET 半H桥,用于驱动三相无刷直流电机(BLDC),适用于5V、9V、12V或18V直流电源轨或1S至4S电池供电应用。内部集成三个具有集成电流感测功能的电流感测放大器(CSA),可感测BLDC电机的三相电流,从而实现FOC和电流控制系统设计方案。集成保护特性:VM 欠压锁定 (UVLO)、 电荷泵欠压 (CPUV)、过流保护 (OCP)、热警告和热关断 (OTW/OTSD)、故障条件指示引脚 (nFAULT)支持 1.8V、3.3V 和 5V 逻辑输入。

zhusl6688的博客 1228

Java -- Serializable序列化 与 Parcelable序列化 反序列化

Serializable序列化操作 什么情况下需要序列化 a)当你想把的内存中的对象写入到硬盘的时候; b)当你想用套接字在网络上传送对象的时候; c)当你想通过RMI传输对象的时候; 实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。 (序列化:-序列化是为了保持对象在内存中的状态,并...

wuzhen007的博客 408

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

yilvyangguang520的博客 3991

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java基础 (12) - 序列化

一、序列化是干什么的? 内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。 二、什么情况下序列化 a、对象需要持久化 (硬盘or数据库) b、网络传输 (套接字orRMI) c、在进程间传递对象 三、序列化ID的作用 java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本...

lmcs87的专栏 116

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android中intent传递对象和Bundle的用法

android中的组件间传递的对象一般实现Parcelable接口,当然也可以使用java的Serializable接口,前者是android专门设计的,效率更高,下面我们就来实现一个Parcelabel。1.序列化 作用:序列化是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。即:序列化是一种能比较好的保存对象状态的机制;

和代码打交道的日子的博客 543

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

在Android中通过Intent使用Bundle传递对象

Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法。 被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在使

zuolongsnail的专栏 4万+

Parcelable和Serializable的区别

一、对象为什么需要序列化 1.永久性保存对象,保存对象的字节序列到本地文件。 2.通过序列化对象在网络中传递对象。 3.通过序列化对象在进程间传递对象。 二、当对象需要被序列化时如何选择所使用的接口 1.在使用内存的时候Parcelable比Serializable的性能高。 2.Serializab...

android开发笔记 730

Intent传递对象——Serializable和Parcelable区别

Intent在不同的组件中传递对象数据的应用非常普遍。下面介绍两种通过Intent传递对象的方法。 1、实现Serializable接口 2、实现Parcelable接口   为什么要将对象序列化?  1、永久性保存对象,保存对象的字节序列到本地文件中;  2、用过序列化对象在网络中传递对象;  3、通过序列化对象在进程间传递对象。   1、实现Serializable接口  

nuli1228588792的博客 267

ET框架客户端性能调优实战:从Profiler分析到ECS架构优化

在游戏开发中,性能优化是确保流畅体验的核心环节,尤其对于采用ECS(实体组件系统)架构的项目。ECS通过数据与逻辑分离、数据局部性等原理,为高性能计算提供了基础。其技术价值在于提升缓存命中率、支持大规模实体管理和并行处理。在Unity引擎中,结合ET框架的客户端开发,性能调优涉及CPU耗时分析、内存管理、GC(垃圾回收)控制等多个方面。使用Unity Profiler进行深度性能剖析是关键步骤,它能帮助开发者定位热点函数、分析内存分配与泄漏。针对ET客户端的特有场景,如高频网络消息处理、大规模实体更新和资源

weixin_31509753的博客 251

对象序列化分析(一)

对象的序列化(串行化)序列化概念:(1)对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下 来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence)。对象通过写出描述自己状 态的数值来记录自己 ,这个过程叫对象的串行化(Serialization-连续) 。(2)一个对象随着创建而存在,随...

diaoda7872的博客 100

【Java】IO操作之对象序列化及反序列化

对象序列化的概念 对象序列化使得一个程序可以把一个完整的对象写到一个字节流里面;其逆过程则是从一个字节流里面读出一个事先存储在里面的完整的对象,称为对象的反序列化。 将一个对象保存到永久存储设备上称为持续性。对象的序列化即可实现持续性。 一个对象要想能够实现序列化,必须实现  Serializable 接口或 Externalizable 接口。 对象序列化的作用 一、对象序列化可以

欲买桂花同载酒,终不似,少年游。 1949
上一篇: Java对象序列化
下一篇: C++之父Bjarne谈C++中的STL模板(一)
strollerV
博客等级 码龄20年 13粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值