Java对象序列化

Jetson编译安装pycuda 可使用nvcc --version查看是否有信息输出,若没有,且安装cuda的情况下,需要手动将CUDA 的路径添加到环境变量中。编译生成_pvt_struct.cpython-38-aarch64-linux-gnu.so文件。基于jetson orin nano jetpack512模块上安装pycuda。4、获取pycuda源码(版本根据实际情况获取)2、进入conda环境并安装cuda工具包。9、若未检测出来需要清除并强制编译。7、编译成功后安装pycuda。5、配置编译并设置环境变量。 阅读详情

序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,

可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接

将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB

都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有

许多实用意义。

一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机

上的服务,就像在本地机上运行对象时一样。

二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。

可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序

列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能

得到整个对象序列。

 

从上面的叙述中,我们知道了对象序列化是java编程中的必备武器,那么让我们从基础开始

,好好学习一下它的机制和用法。


java序列化比较简单,通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Seri
alizable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码。只
有极少数情况下才需要定制代码保存或恢复对象状态。这里要注意:不是每个类都可序列化,
有些类是不能序列化的,例如涉及线程的类与特定JVM有非常复杂的关系。

序列化机制:

序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字
节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列
化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的
对象实例。ObjectOutputStream中的序列化过程与字节流连接,包括对象类型和版本信息。
反序列化时,JVM用头信息生成对象实例,然后将对象字节流中的数据复制到对象数据成员中。
下面我们分两大部分来阐述:


处理对象流:
(序列化过程和反序列化过程)


java.io包有两个序列化对象的类。ObjectOutputStream负责将对象写入字节流,ObjectInp
utStream从字节流重构对象。
    我们先了解ObjectOutputStream类吧。ObjectOutputStream类扩展DataOutput接口。
writeObject()方法是最重要的方法,用于对象序列化。如果对象包含其他对象的引用,则
writeObject()方法递归序列化这些对象。每个ObjectOutputStream维护序列化的对象引用表,
防止发送同一对象的多个拷贝。(这点很重要)由于writeObject()可以序列化整组交叉引用的
对象,因此同一ObjectOutputStream实例可能不小心被请求序列化同一对象。这时,进行反引用
序列化,而不是再次写入对象字节流。
下面,让我们从例子中来了解ObjectOutputStream这个类吧。

// 序列化 today's date 到一个文件中.
    FileOutputStream f = new FileOutputStream("tmp");
    ObjectOutputStream s 
= new ObjectOutputStream(f);
    s.writeObject(
"Today");
    s.writeObject(
new Date());
    s.flush();

现在,让我们来了解ObjectInputStream这个类。它与ObjectOutputStream相似。它扩展Dat
aInput接口。ObjectInputStream中的方法镜像DataInputStream中读取Java基本数据类型的
公开方法。readObject()方法从字节流中反序列化对象。每次调用readObject()方法都返回
流中下一个Object。对象字节流并不传输类的字节码,而是包括类名及其签名。readObject()
收到对象时,JVM装入头中指定的类。如果找不到这个类,则readObject()抛出
ClassNotFoundException,如果需要传输对象数据和字节码,则可以用RMI框架。
ObjectInputStream的其余方法用于定制反序列化过程。
例子如下:

 

//从文件中反序列化 string 对象和 date 对象
    FileInputStream in = new FileInputStream("tmp");
    ObjectInputStream s 
= new ObjectInputStream(in);
    String today 
= (String)s.readObject();
    Date date 
= (Date)s.readObject();
 
定制序列化过程:

序列化通常可以自动完成,但有时可能要对这个过程进行控制。java可以将类声明为serial
izable,但仍可手工控制声明为static或transient的数据成员。
例子:一个非常简单的序列化类。

 

public class simpleSerializableClass implements Serializable{
    String sToday
="Today:";
    
transient Date dtToday=new Date();
}


序列化时,类的所有数据成员应可序列化除了声明为transient或static的成员。将变量声明为transient告诉JVM我们会负责将变元序列化。将数据成员声明为transient后,序列化过程就无法将其加进对象字节流中,没有从transient数据成员发送的数据。后面数据反序列化时,要重建数据成员(因为它是类定义的一部分),但不包含任何数据,因为这个数据成员不向流中写入任何数据。记住,对象流不序列化static或transient。我们的类要用writeObject()与readObject()方法以处理这些数据成员。使用writeObject()与readObject()方法时,还要注意按写入的顺序读取这些数据成员。


关于如何使用定制序列化的部分代码如下:

//重写writeObject()方法以便处理transient的成员。
public void writeObject(ObjectOutputStream outputStream) throws IOException{
    outputStream.defaultWriteObject();
//使定制的writeObject()方法可以
                        利用自动序列化中内置的逻辑。
    outputStream.writeObject(oSocket.getInetAddress());
    outputStream.writeInt(oSocket.getPort());
}

//重写readObject()方法以便接收transient的成员。
private void readObject(ObjectInputStream inputStream) throws
IOException,ClassNotFoundException
{
    inputStream.defaultReadObject();
//defaultReadObject()补充自动序列化
    InetAddress oAddress=(InetAddress)inputStream.readObject();
    
int iPort =inputStream.readInt();
    oSocket 
= new Socket(oAddress,iPort);
    iID
=getID();
    dtToday 
=new Date();
}



完全定制序列化过程:

 

如果一个类要完全负责自己的序列化,则实现Externalizable接口而不是Serializable接口

。Externalizable接口定义包括两个方法writeExternal()与readExternal()。利用这些方

法可以控制对象数据成员如何写入字节流.类实现Externalizable时,头写入对象流中,

然后类完全负责序列化和恢复数据成员,除了头以外,根本没有自动序列化。这里要注意了。

声明类实现Externalizable接口会有重大的安全风险。writeExternal()与readExternal()

方法声明为public,恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信息,

则要格外小心。这包括使用安全套接或加密整个字节流。

 

来!简单了解一下计算机发展史! ​ 1936年,英国数学家阿兰・麦席森・图灵提出了一种抽象的计算模型——图灵机( Turing machine)。图灵机,又称图灵计算机,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算。​ 图灵机是一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。 阅读详情

相关推荐

手把手教你用Kali Linux搭建vulntarget-a靶场环境(附详细配置步骤)

本文详细介绍了如何在Kali Linux环境下搭建vulntarget漏洞靶场,包括环境规划、虚拟化平台配置、靶机系统部署及安全工具链配置等关键步骤。通过实战演练,帮助网络安全从业者和初学者掌握专业级漏洞实验平台的搭建与管理技巧,提升安全测试能力。

weixin_29279101的博客 107

java 对象序列化

如果需要更复杂的序列化控制,可以定义和// 调用默认序列化方法// 进行额外处理(例如加密某些字段)// 调用默认反序列化方法// 进行额外处理(例如解密某些字段)当然我们也可以自定义序列化过程。

sjb2274540432的博客 1850

手把手教你解决uniapp中esbuild版本冲突问题(Mac版专属指南)

本文是针对Mac平台uniapp开发者的专属指南,详细解析了运行项目时常见的`Cannot start service`错误,即esbuild的Host版本与binary版本不匹配问题。文章从错误根源入手,提供了从快速应急处理到彻底根治的完整解决方案,包括手动替换二进制文件、锁定依赖版本、清理缓存及优化工具链配置,旨在帮助开发者高效解决版本冲突,恢复并稳定开发环境。

i0j1k2l3m的博客 458

java对象序列化

 java对象序列化概述  序列化的过程就是对象写入字节流和从字节流中读取对象。  将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存在文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。  对象序列化功能可应用在RMI/Socket/JMS/EJB  简化了对象持久化(Persistence)的实现  XML序列化指的是把对象转换成XML数

1668

Adobe Acrobat Pro(Adobe PDF) - 使用技巧

Adobe Acrobat Pro为Adobe出品的PDF查看和编辑软件,下文简称Adobe PDF,该软件功能强大,拥有查看PDF、编辑PDF、打印PDF、导出PDF、合并文件、组织页面、文本标注、注释、动作向导、等功能。本文介绍Adobe PDF的一些使用技巧,最后介绍软件设置。

NSJim的博客 4万+

从 0 到 1,实战 Power BI 电商销售可视化看板全流程

本文详细介绍了从零开始使用Power BI构建电商销售可视化看板的全流程,涵盖数据准备、建模、可视化设计及高级功能应用。通过实战案例展示如何将复杂销售数据转化为直观图表,帮助电商从业者快速掌握销售趋势、热销产品和用户画像等关键信息,提升数据分析效率。

weixin_29061041的博客 484

java 对象怎么序列化,java对象序列化总结

java对象序列化小结百度百科上介绍序列化是这样的:序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 Serializa...

weixin_39896839的博客 463

Java8动态生成SFunction:基于字段名的Lambda表达式实践

本文深入探讨了在Java8中如何基于字段名动态生成SFunction,以解决MyBatis Plus的LambdaQueryWrapper在动态查询场景下的局限性。通过核心原理LambdaMetafactory的解析和手把手的代码实现,展示了如何将字符串字段名转换为类型安全的Lambda表达式,从而实现真正动态、类型安全的查询条件构建与通用数据处理,显著提升代码的灵活性与安全性。

sss66的博客 953

java 对象序列化磁盘_java对象序列化

定义:对象序列化目标是将对象保存在磁盘中,允许在网络中直接传输对象。序列化机制把内存中的java对象转化成与平台无关的二进制流,从而可以把这种二进制流永久的保存在磁盘上,通过网络把二进制流传送到另一个网络节点,其他程序一旦获得了二进制流,不管是从磁盘还是网络获取的,都可以将此转换成java对象。如果要把某个对象序列化,这个对象必须要实现Serializable接口,实现此接口无需实现任何方法,此接...

weixin_34966374的博客 248

使用GeoServer发布WMS动态地图服务,使用openlayers访问wms服务浏览地图数据

GEOServer是java版开源工具,使用GEOServer简单几步就可以搭建自己的地图服务,与小伙伴们共享地图数据。 一、使用GEOServer发布WMS动态地图服务 大致步骤如下: 1. 新建工作区 左边菜单栏,工作区,新建,起个名字,设置url。 2. 选择数据源 左边菜单栏,选择“数据源”,点击“添加新的数据源”,常用的有shp、postgresql数据库,根据自己的需要选择,这里选择了shp文件源。 选中存放在刚才新建的工作区下面,给数据源起个名字,选择文件本机存放位置,设置编码,包含中文属

从地图看世界的专栏 4540

DDR5 JEDEC标准简析:一次读懂DDR5的核心规范!

JEDEC,全称是,中文名称是「电子元件工程联合委员会」,它是全球权威的存储接口标准制定机构。我们常见的 DDR2、DDR3、DDR4、DDR5 都是它搞出来的。📌 JEDEC 就像存储接口界的“裁判+编剧”——规定谁该怎么跑,怎么演,怎么配合。

weixin_43199439的博客 2571

Java基础之对象序列化

概述Java中的对象的内部状态只保存在内存中,其生命周期最长与JVM的生命周期一样,即JVM停止之后,所有对象都会被销毁。但有时候,Java对象是需要持久化的,因此Java提供了一种对象持久化方式——对象序列化机制(Object serialization),可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对象序列化不会关注类

#include<?> 3317

【ROS机器人系统】实验4 ROS简单应用:激光SLAM与导航

ROS简单应用:激光SLAM与导航 (1)了解机器人和SLAM之间关系 (2)了解激光SLAM (3)了解gmapping和导航

南京大学软件工程硕士在读 2146

java 对象序列化要序列化那些内容

1.java的对象序列化,只保存对象的类型信息和属性类型和属性值,三部分数据。对象中的方法,不管有多少,都不会进行序列化。package com.hs.javafan; import java.io.Serializable; public class SerializableObject implements Serializable { private String name; private int age; private String address; pub

Alex的专栏 1345

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java之对象序列化

一、简介 对象序列化的目的是将对象保存到磁盘, 或者允许在网络中传输。相对的, 反序列化就是根据磁盘中保存的文件恢复对象。 要让某个类的对象能够序列化, 需要实现下面2个接口之一: -Serializable -Externalizable 二、对象流实现序列化 通过实现Serializable接口让一个类的对象可序列化的步骤十分简单, 仅仅是在声明一个类时声明实现该接口即可, 无需实现任何方法 ...

csdnLeraner的博客 587

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JAVA对象的序列化

一 概述 对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久化地保留在磁盘上,通过网路传输这种二进制流到另一个网络节点。其他的程序一旦获得了这阵二进制流(无论从磁盘获取的,还是网路获取的)都可以将这种二进制流恢复成原来的Java对象。 二 使用对象流实现序列化和反序列化 序列化: ...

qfc8930858的博客 164

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java中对象的序列化

简单的说,是对对象进行序列化的处理,以流的形式进行传输。其目的是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。 Java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的“深复制”,即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

等一个晴天 1444

java 序列化对象 内存_Java 对象的序列化、反序列化

对象的序列化(Serialize):将内存中的Java对象转换为与平台无关的二进制流(字节序列),然后存储在磁盘文件中,或通过网络传输给另一个网络节点。对象的反序列化(Deserialize):获取序列化的二进制流(不管是通过网络,还是通过读取磁盘文件),将之恢复为原来的Java对象。要实现对象的序列化,该对象所属的类必须要是可序列化的,即该类必须实现以下2个接口之一:Serializable ...

weixin_39933356的博客 168

Java对象流、对象序列化与反序列化

Java对象流、对象序列化与反序列化 对象的序列化可以将一个对象的成员信息保存为一个datdatdat文件存到硬盘上,反序列化就是可以直接从该文件读该对象。 package Exp7; import java.io.*; class PersonalInfo implements Serializable { //实体类实现接口Serializable private static final long serialVersionUID = 1L; private String na

Harris-H的博客 569

Java 中的对象序列化

对象的序列化(Serialize)指将一个Java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该Java对象,如果需要让某个对象支持序列化机制,则必须让它的类是可序列化的(serializable)。 为了让某个类是可序列化的,该类必须实现如下两个接口之一: 1、Serializable(常用) 2、Externalizable(不常用) J...

是魔鬼还是秀儿的博客 390

java 对象序列化是什么_Java什么是对象序列化?

小编典典你可以将序列化视为将对象实例转换为字节序列(取决于实现的二进制或非二进制)的过程。当你要通过网络传输一个对象数据(例如从一个JVM传输到另一个JVM)时,此功能非常有用。在Java中,平台内置了序列化机制,但是你需要实现Serializable接口才能使对象可序列化。你还可以通过将属性标记为transient来防止对象中的某些数据被序列化。最后,你可以覆盖默认机制,并提供自己的机制。这在某...

weixin_34094525的博客 211

java 对象序列化实例_Java对象序列化

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初...

weixin_31293733的博客 214

Java对象序列化和反序列化

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,即Java对象序列号,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象,即反序列化。 把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。对象的序列化主要有两种用途

quanleilei123的专栏 2747

JAVA对象序列化的使用

JAVA对象序列化的使用 Employee类: package com.kun.package3; import java.io.Serializable; public class Employee implements Serializable { public String name; public String address; public String SSN; public int num; public Employee() { }

Kunaly 407
上一篇: windows消息机制
下一篇: 对象的序列化 之 对象持续性
strollerV
博客等级 码龄20年 13粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值