K:Serializable或Externalizable对象的序列化

生成对抗网络(GAN、DCGAN、ACGAN)-----学习笔记 生成对抗网络学习笔记 生成对抗网络有两个关键结构:生成模型、判别模型。 生成模型:输入是一个服从正态分布的N维向量,利用这个N维向量生成一张图片。 判别模型:对于生成模型输出的图像判别它是不是真的图像。 生成模型和判别模型的博弈关系在于:生成模型的目的是生成让判别模型无法判别真伪的图像,而判别模型的目的是判断输入图像的真伪。 结合代码来看生成对抗网络中,生成器和判别器的训练过程: 判别模型的训... 阅读详情

在java中,对一个对象进行序列化操作,其有两种方式,第一种是通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializable接口的类,其序列化过程是默认的,当然,也可以通过在该类中重写如下四个方法对序列化的过程进行控制:

0、private Object writeReplace() throws ObjectStreamException;

1、private void writeObject(java.io.ObjectOutputStream out) throws IOException;

2、private void readObject(java.io.ObjectInputStream in) throws Exception;

3、private Object readResolve() throws ObjectStreamException;

其中方法0和方法1是序列化的过程中会进行调用的方法,方法2和方法3是反序列化过程中会进行调用的方法。其执行的顺序是按照以上方法的排列顺序从上到下执行的。在进行序列化时候,其序列化类ObjectOutputStream会通过反射调用writeReplace()方法,此时,可以通过返回一个与本类兼容的对象的方式替换掉需要进行序列化的本类的对象(也就是this),使其序列化所返回的对象,需要注意的是,其返回的对象的类型是需要和所序列化的本类的类型兼容的,否则,其会报ClassCastException异常。在调用完writeReplace()方法之后,其会接着调用writeObject(ObjectOutputStream out)方法进行进一步的序列化操作。在该方法中,可以序列化额外的对象,也可以调用out.defaultWriteObject()进行默认的序列化操作,其中方法的参数out对象是其原先所创建的ObjectOutputStream对象。

对于反序列化的过程,其会先通过反序列化类ObjectInputStream对象去调用readObject(ObjectInputStream in)方法,在调用该方法的时候,其可以通过in对象进行额外的反序列化操作,也可以通过调用in.defaultReadObject()方法进行默认的反序列化操作,其中方法的参数in对象是原先所创建的ObjectInputStream对象。在调用完该方法之后,其会接着调用readResolve()方法,其方法的返回值为一个Object对象,该方法返回的对象将会代替反序列化的结果,直接将其作为反序列化的结果返回给上层调用ObjectInputStream对象readObject方法的结果。

其执行过程演示代码如下:

@代码来源:http://www.cnblogs.com/yoohot/p/6019767.html

package other.serial;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.ObjectStreamException;

import java.io.Serializable;

/**

 * 该类用于演示说明可序列化类中重写(override)

 * writeReplace()方法、writeObject(ObjectOutputStream out)方法、readObject(ObjectInputStream in)方法、readResolve()方法

 * 时,其进行序列化和可序列化的调用相关过程

 * @author 学徒

 *

 */

public class PersonSingleton implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;

    private PersonSingleton(String name) {

        this.name = name;

    }

    private static PersonSingleton person = null;

 

    public static synchronized PersonSingleton getInstance() {

        if (person == null)

            return person = new PersonSingleton("cgl");

        return person;

    }

 

    private Object writeReplace() throws ObjectStreamException {

        System.out.println("1 write replace start");

        return this;//可修改为其他对象

    }

 

    private void writeObject(java.io.ObjectOutputStream out) throws IOException {

        System.out.println("2 write object start");

        out.defaultWriteObject();

       //out.writeInt(1);

    }

 

    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {

        System.out.println("3 read object start");

        in.defaultReadObject();

       //int i=in.readInt();

    }

 

    private Object readResolve() throws ObjectStreamException {

        System.out.println("4 read resolve start");

        return PersonSingleton.getInstance();//不管序列化的操作是什么,返回的都是本地的单例对象

    }

 

    public static void main(String[] args) throws Exception {

 

        FileOutputStream out = new FileOutputStream(new File("H://person.dat"));

        ObjectOutputStream op = new ObjectOutputStream(out);

        op.writeObject(PersonSingleton.getInstance());

        op.close();

 

        FileInputStream in = new FileInputStream(new File("H://person.dat"));

        ObjectInputStream oi = new ObjectInputStream(in);

        Object person = oi.readObject();

        in = new FileInputStream(new File("H://person.dat"));

        oi = new ObjectInputStream(in);

        PersonSingleton person1 = (PersonSingleton) oi.readObject();

 

        System.out.println("sington person hashcode:" + person.hashCode());

        System.out.println("sington person1 hashcode:" + person1.hashCode());

        System.out.println("singleton getInstance hashcode:" + PersonSingleton.getInstance().hashCode());

        System.out.println("singleton person equals:" + (person == PersonSingleton.getInstance()));

        System.out.println("person equals1:" + (person1 == person));

    }

}

 

输出结果:

1 write replace start

2 write object start

3 read object start

4 read resolve start

3 read object start

4 read resolve start

sington person hashcode:13620718

sington person1 hashcode:13620718

singleton getInstance hashcode:13620718

singleton person equals:true

person equals1:true

第二种方式是通过实现Externalizable接口,其中Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由类自身来控制序列化的行为(通过重写 writeExternal()与readExternal()方法)

@代码来源:dovecat.iteye.com/blog/66044

package other.serial;

 

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.Externalizable;

import java.io.IOException;

import java.io.ObjectInput;

import java.io.ObjectInputStream;

import java.io.ObjectOutput;

import java.io.ObjectOutputStream;

import java.io.ObjectStreamException;

/**

 * 用于演示通过实现Externalizable接口进行序列化和反序列化过程的案例

 * @author 学徒

 *

 */

public class ExternalizableTest implements Externalizable

{

public ExternalizableTest()

{

System.out.println("反序列化的过程中进行调用");

}

private String message;

 

public String getFoo()

{

return message;

}

 

public void setMessage(String message)

{

this.message = message;

}

 

private Object writeReplace() throws ObjectStreamException

{

System.out.println("writeReplace invoked");

return this;

}

private void writeObject(ObjectOutputStream out)throws IOException

{

System.out.println("writeObject invoked");

}

private void readObject(ObjectInputStream in) throws IOException

{

System.out.println("readObject invoked");

}

private Object readResolve() throws ObjectStreamException

{

System.out.println("readResolve invoked");

return this;

}

 

@Override

public void readExternal(ObjectInput arg0) throws IOException,ClassNotFoundException

{

System.out.println("readExternal invoked");

Object obj = arg0.readObject();

}

@Override

public void writeExternal(ObjectOutput arg0) throws IOException

{

System.out.println("writeExternal invoked");

arg0.writeObject("Hello world");

}

 

public static void main(String[] args) throws IOException,ClassNotFoundException

{

ExternalizableTest fooimpl = new ExternalizableTest();

fooimpl.serialize();

}

public Object serialize() throws IOException, ClassNotFoundException

{

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(baos);

oos.writeObject(this);

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bais);

return ois.readObject();

}

}

运行结果:

反序列化的过程中进行调用

writeReplace invoked

writeExternal invoked

反序列化的过程中进行调用

readExternal invoked

readResolve invoked

在此writeExternal 和readExternal 的作用与writeObject和readObject 一样,且当同同时存在时候,只会调用writeExternal和readExternal方法。

序列化所需要的注意事项:

1.反序列化(实现Serializable接口的序列化对象)无需通过构造器初始化对象,实现Externalizable进行序列化时,需要提供一个无参的构造函数供反序列化的过程进行对象创建的调用;

2.如果使用序列化机制向文件中写入了多个对象,那么取出和写入的顺序必须一致;

3.Java对类的对象进行序列化时,若类中存在对象引用(且值不为null),也会对类的引用对象进行序列化(前提是该引用对象的类实现了序列化相关的接口,如果该对象值不为null且没有实现序列化相关的接口且其没有被transient关键字进行修饰时,在序列化时其会抛出java.io.NotSerializableException异常)。

4.反序列化时必须要有序列化对象的类的class文件;

5.当某个字段被声明为transient后,默认序列化机制就会忽略该字段。

6.如是一个类是可序列化的,那么它的子类也是可序列化的。

7.当我们同时实现了两个interface的时候,JVM只运行Externalizable 接口里面的writeExternal 和readExternal 方法对序列化内容进行处理.

 @汇总内容出处:http://blog.youkuaiyun.com/gitar520/article/details/7613122

Serializable接口和Externalizable接口各自的优缺点:

Serializable接口

        优点:内建支持

        优点:易于实现

        缺点:占用空间过大

        缺点:由于额外的开销导致速度变比较慢

Externalizable接口

        优点:开销较少(程序员决定存储什么)

        优点:可能的速度提升

        缺点:虚拟机不提供任何帮助,也就是说所有的工作都落到了开发人员的肩上

Serializable和Externalizable的比较汇总:

序    号

区    别

Serializable

Externalizable

1

实现复杂度

实现简单,Java对其

有内建支持

实现复杂,

由开发人员自己完成

2

执行效率

所有对象由Java统一保存,

性能较低

开发人员决定哪个对象保存,

可能造成速度提升

3

保存信息

保存时占用空间大

部分存储,

可能造成空间减少


关于序列化相关的更多问题,可以参看博文:http://blog.youkuaiyun.com/androiddevelop/article/details/17537841

华为OD机试双机位A卷 - 小明减肥 (C++ & Python & JAVA & JS & GO) 华为OD机试2025双机位A卷 小明减肥,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解 阅读详情

相关推荐

查看电脑mac地址+主机名+用户名并导出

张三:李四,应公司要求,今天下班前必须将这张表格里面用户电脑的mac地址统计出来!李四:我该怎么办呢?一个一个查看,太没有效率了吧!对了,我可以做一个bat脚本啊!

拥抱着青春 1975

现代安卓开发之-kotlin序列化KSerializer

Android kotlin 序列号化

qq_30519365的博客 472

Cadence Sigrity

目录 一、PowerSI 1、PowerSI仿真前设置 2、PowerSI提取S参数 (1)检查叠层 (2)选择需要提取的走线和GND (3)设置端口 (4)设置提取频率和提取方式 (5)运行仿真 一、PowerSI PowerSI是一个交流分析工具,适用于频域仿真。 S参数提取 电源阻抗提取 全波参数提取 阻抗、耦合检查 谐振分析 1、PowerSI仿真前设置 打开PCB文件: 打开后如图: 设置为单色后: 仿真前的设置:

fang_yang_wa的博客 3万+

Kotlinx.serialization核心API详解:Serializable注解与KSerializer深度解析

Kotlinx.serialization是Kotlin官方提供的跨平台、多格式序列化库,它为Kotlin开发者提供了简单高效的序列化解决方案。在前100个字内,我们明确介绍这个项目的核心功能:Kotlin序列化库通过@Serializable注解和KSerializer接口,让对象序列化变得轻松自然。😊 ## 什么是Kotlinx.serialization? Kotlinx.serial

gitblog_00731的博客 1185

【SLAM】探索explore_lite在移动机器人自主建图中的高效边界检测策略

本文深入解析了explore_lite在移动机器人自主建图中的应用,重点探讨了其高效的贪婪边界检测策略。该工具包专为资源受限平台设计,通过直接利用SLAM生成的地图信息,以极低的计算开销实现快速、稳定的未知区域探索,并与move_base导航框架无缝协作,是轻量级机器人自主探索的优选方案。

purple的博客 1067

PT:pt write_change to innovus 脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1527

序列化探索之二 - Kotlin

文章不长,但代码演示居多,可选择性阅读 Kotlin以扩展包的形式提供了序列化能力,使得能够以“Kotlin方式”进行序列化。Kotlin设计目标,是提供一个序列化抽象,具体格式实现可用Json、CBOR、Protobuf、Properties、Yaml等进行替换。但就目前的进度,仅提供了对Json的稳定支持。其它格式都处于试验阶段。 因此,我们看Kotlin的序列化,主要看的就是数据对象与Json之间的序列化和反序列化。 能力展示 场景假设:需要序列化一个数据类,包含五个字段 resourceId:.

zou8944的博客 4485

FAST-LIVO2 源码精读(十八):实时性优化、漂移排查与工程落地

FAST-LIVO2 的工程价值,不在于某一个孤立的技巧,而在于它把"激光的几何精度、惯性的高频预测、视觉的纹理与色彩"用一套简洁的滤波框架紧紧拧在一起,又在实时性、鲁棒性、可扩展性之间取得了难得的平衡。先用内建计时表定位瓶颈,再按降采样、并行、滑窗、编译优化、双频输出逐项加速;遇到漂移先看现象、循诊断树定位根因、回到对应章节取解法。十八篇至此收束。

PX4-SLAM-PNC 218

kotlinx.serialization:具有回退功能的JSON解串器

In a perfect world, the consumer and producer of an API would always be in lockstep, only changing with each other and adhering to the strictest of contracts. Alas, we live in the real world, and it h...

weixin_26739079的博客 582

AUTOSAR MCAL开发及EB Tresos工具使用总结

在基于AutoSar CP架构开发MCAL时,会使用到EB tresos工具。本文主要对MCAL开发及EB tresos工具使用进行总结,仅作为自学使用,以方便后续查漏补缺。

liuxu324的博客 2629

RK平台PCIE-Ethernet扩展:Intel I210移植与性能飞升之路

本文详细介绍了Intel I210千兆以太网控制器在瑞芯微RK平台的移植与优化过程。通过硬件适配、内核配置、驱动开发及性能调优四个关键环节,实现了RK平台的网络性能提升。硬件方面,重点说明了PCIE接口的规范连接与供电检查;软件方面,系统阐述了内核配置、设备树修改和驱动编译流程。在性能优化环节,详细介绍了中断优化、缓冲区设置和TCP/IP协议栈调优策略,并采用Iperf和Netperf工具进行量化测试验证。测试结果显示,优化后的网络吞吐量提升20%以上,延迟降低40%,为工业控制、智能安防等场景提供了可靠的

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 353

Kotlinx.serialization VS Gson

JSON is an open-standard file format or data interchange format that uses human-readable text to transmit data objects consisting of attribute-value pairs and array data types. Java中常见的JSON解析库有Moshi...

移动端开发干货分享 2090

基于matlab的LFM脉冲压缩仿真

传统雷达测距是通过发射点频脉冲串实现的,通过发射脉冲与回波的时延确定目标的距离。此类方法易于实现,对接收机的要求较低。一般要获取更好的距离分辨力,需要增加发射信号的带宽,对于点频脉冲信号即需要减小发射脉冲宽度;而为获取更大的探测距离,提升雷达威力,则需要发射更大占空比的脉冲串。由于点频信号的时宽带宽积约等于1,因此不能同时增加信号的时宽和带宽。若要保持距离分辨力,增大占空比就需要减少雷达的脉冲重复周期(PRT)。这样会减小雷达的无模糊探测距离,也会造成目标回波频繁被遮挡,损失雷达威力。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 1771

K:java中序列化的两种方式—Serializable或Externalizable

在java中,对一个对象进行序列化操作,其有如下两种方式: 第一种: 通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializable接口的类,其序列化过程是默认的,当然,也可以通过在该类中重写如下四个方法对序列化的过程进行控制: 0. private Object writeReplace() throws Ob...

diaosangwan0363的博客 136

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java中序列化的方式_K:java中序列化的两种方式—Serializable或Externalizable

在java中,对一个对象进行序列化操作,其有如下两种方式:第一种: 通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializable接口的类,其序列化过程是默认的,当然,也可以通过在该类中重写如下四个方法对序列化的过程进行控制:0. private Object writeReplace() throws ObjectStr...

weixin_31439907的博客 327

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java高手的30k之路|面试攻略|精通序列化和反序列化

Serializable接口|transizent关键字|版本控制|Externalizable接口|对象图序列化|性能优化|安全性|其他技术

weixin_41379244的博客 913

对象序列化

当你创建对象时,只要你需要,它就会一直存在,但是在程序终止时,无论如何它都不会继续存在。如果对象能 够在程序不运行的情况下仍然存在并保存其信息,那将非常有用。这样,在下一次运行程序时,该对象将被重建 并且拥有的信息与在程序上次运行时它所拥有的信息相同。当然,可以通过将对象信息写入文件或是数据库来达 到相同的效果,但是在使万物都成为对象的精神中,如果能够将一个对象声明为是持久性的,并为我们处理...

longcxm1的博客 127

Tinking in Java ---Java的NIO和对象序列化

前面一篇博客的IO被称为经典IO,因为他们大多数都是从Java1.0开始就有了的;然后今天这篇博客是关于NIO的,所以的NIO其实就是JDK从1.4开始,Java提供的一系列改进的输入/输出处理的新功能,这些新功能被统称为新IO(New IO ,简称NIO)。另一个概念对象序列化指的是将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列再转换成原来的对象。这样

荒野孤鹰 3119

K:java中的序列化与反序列化

Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?以下内容将围绕这些问题进行展开讨论。 Java序列化与反序列化 简单来说Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。 为什么需要序列化与反序列化 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、...

diaosangwan0363的博客 93

java 对象序列化实例_Java中对象的序列化详解及实例

Java中对象的序列化详解及实例把java对象转化为字节序列的过程称为对象的序列化。把字节序列恢复为java对象的过程称为对象的反序列化。对象序列化的用途:1.把对象的字节序列永久的保存到硬盘上,通常存放在一个文件中2.在网络上传送对象的字节序列化void writeObject(Object obj) 方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中(将指定的对象写入...

weixin_42114580的博客 236

java的序列化之Externalizable接口

控制序列化字段还可以使用Externalizable接口替代Serializable借口。此时需要定义一个默认构造器,否则将为得到一个异常(java.io.InvalidClassException: Person; Person; novalid constructor);还需要定义两个方法(writeExternal()和readExternal())来控制要序列化的字段。在Pe...

weixin_30337251的博客 98

对象序列化----transient关键字的作用

 对象的序列化(Serialize)指将一个Java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该Java对象。 jbbI g~/        为了让某个类是可序列化的,该类必须实现如下两个接口之一: t+j;Vvq  Serializable Externalizable      对象序列化的目标是将对象保存到磁盘中,或允许在网络

liaozm_168的专栏 1794

fileinputstream自定义类序列化和反序列化_代码审计 | Javaweb学习之路序列化和反序列化...

0x01 序言步入新的一年,已经差不多快过去1/4年了,感觉自己啥都没学除了皮。所以现在立个flag,整理一些以前学过的东西,温故知新在学点新东西。那么这个第一篇就从反序列化开始。当然我觉得java难就难在读起来需要一点点的基础,我也试着尽量用通俗的语言去写。0x02 正言一、序列化现在的大环境由于CTF或者攻防赛的兴起,导致了大多数人关注的是PHP下的一些问题,自从工作之后就发现,在企...

weixin_42464553的博客 175

java基础系列(八)之自定义序列化

我们都知道java中实现序列化和反序列化,一般只需要实现接口Serializable即可。 一.序列化,反序列化1.定义: 序列化:将数据分解成字节流,以便存储在文件中或在网络上传输。 反序列化:打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例。2.java中序列化特点: 如果某个类能够被序列化,其子类也可以被序列化。声明

xqhadoop的博客 826

为什么要对对象进行序列化操作?

对象序列化到底有什么好处?2g'Q#u7M"{ Wbbs.spoto.net 数据操作规范类似于还是等于XML文件,保证数据一致性和安全性IT雏鹰部落:S z"d2c&h "\+T!H+B#L6M*H.^3] 为什么要对对象进行序列化?为什么不直接用数据库来存储数据?+@$v0G-y,r 采用数据流来存储 ,以数据流传输会提高网络传输速度,在数据流进行操作可以直接操作数据...

YOUNG918 1632

关于对象的序列化问题(整理收藏)

今天看到一个对象的序列化的知识点。所以整理和收藏了一些东西,说不定以后会用的上。 对象的序列化,好像是一个软件中很专业的问题。不过这个看着好像是一个基础问题。是面向对象的一个基础知识点。 Objective-C序列化和反序列化 http://www.codeios.com/thread-31683-1-1.htmlObjective-C可以程序用到的各种对象序列话到文件,在任何需要的情况下,

Mage的专栏 1159
上一篇: K:枚举的线程安全性及其序列化问题
下一篇: KandQ:单例模式的七种写法及其相关问题解析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值