Java I/O全文摘要(十三)过滤流,对象序列化

EasyUI之datagrid展示数据列表 写在最前: 如果你用惯了Web Mvc框架的视图跳转方式来开发后台系统,第一次接触到EasyUI的时候,往往会有一个大大的疑问,这EasyUI是如何做跳转的啊?增删改查都不知道如何下手了!但是当你知道有RestFul编程的时候。你会恍然大悟:我靠,RestFul+EasyUI简直就是绝配呀!博主就是如此:在写完一个增删改查之后,才发现EasyUI越学越有意思,页面都是靠局部刷新来动态展示数据,这... 阅读详情

1 对象序列化

ObjectInputStream 和 ObjectOutputStream实现了  DataInput 和DataOutput

使用方法:

writeObject( ) 和 readObject( )


2 读取和写入对象

将对象的状态信息保存起来,使得之后可以在某一时刻恢复它们。

健壮,可信赖和安全的序列化使得工作变得复杂。


3 流

public class ObjectOutputStream extends OutputStream
  implements ObjectOutput, 
 ObjectStreamConstants
public class ObjectInputStream extends InputStream
  implements ObjectInput, ObjectStreamConstants


两个方法:

public final void writeObject(Object o) throws IOException

public final Object readObject( )
  throws OptionalDataException, ClassNotFoundException, IOException


4 序列化如何工作

考虑一个问题:

如果你有一个类,里面有:

private double x;
private double y;

你需要进行的保存工作就是:

DataOutputStream dout = new DataOutputStream(out);
    dout.writeDouble(x);
    dout.writeDouble(y);

而对应的读取工作就是:

DataInputStream din = new DataInputStream(in);
    this.x = din.readDouble( );
    this.y = din.readDouble( );

这一切看起来非常简单,

然而,如果一个对象包含另外一个对象,或者更可怕的是,有循环引用的时候,问题就变得复杂起来。

幸亏sun公司已经为你处理了这一切,将会保存对象的所有非静态非瞬时的字段,然后保存在特殊的文件里。


5 性能

序列化很方便,但是它很消耗性能,

如果能自己定义,最好自己定义格式。


其次,序列化将减慢或者组织垃圾收集

流可能持有对象的引用,而流可能没有关闭,这就导致对象一直被强引用持有者。


6 序列化接口

由于序列化将访问对象私有接口,这将导致不安全;

其次,序列化一个不合适的对象,例如:Socket对象,它被序列化保存,然后在另一个程序中反序列化,而连接已经不再,这将导致问题。

所以,不是所有的类都需要被序列化。


需要序列化的类应该实现

public interface Serializable
接口。


需要注意的是,如果父类实现了这个接口,子类就无需再次声明了。

例如:

java.lang.Throwable


7 不应该序列化的对象

虽然java.lang.Throwable总是应该被序列化。但是有更多不应该被序列化的类。

例如:流,JavaBeans, 操作系统依赖的, 工具类, 反射。


对象不被序列化的7条理由:

1. 与natvie代码紧密联系

2. 对象状态与虚拟机或者运行时环境有关

3. 序列化会有潜在的安全风险

4. 类就只有一些静态方法

5. 类是非静态内部类。

6. 编写程序的程序员未考虑需要序列化

7. 有更好的方式替代序列化(例如存储到XML中)


8. 不被序列化异常

如果序列化一个未实现序列化接口的类,则会抛出

public class NotSerializableException extends ObjectStreamException


可能导致问题的原因:

1 引用了非序列化对象。

2 父类无参构造方法不存在


处理的方式:

try -catch

或者 transient 对应变量。


9 版本问题

由于序列化一个对象,而对象在反序列化时所处环境可能发生很大变化。例如字段增加删除修改,方法的改变,修饰符的变化等等。

值得一说的是,静态的变量修改不会影响序列化,transient的也不会,但是非transient的实例变量的修改会影响序列化。

所以需要考虑序列化随着版本的演进的问题。


10 兼容性和非兼容性改变

下面这些改动会导致不兼容:

  • Most changes to constructors and methods, whether instance or static. Serialization doesn't touch the methods of a class. The exceptions are those methods directly involved in the serialization process, particularlywriteObject( ) and readObject( ).

  • All changes to static fieldschanging their type, their names, adding or removing them, etc. Serialization ignores all static fields.

  • All changes to transient fieldschanging their type, their names, adding or removing them, etc. Serialization ignores all transient fields.

  • Adding or removing an interface (except the Serializable interface) from a class. Interfaces say nothing about the instance fields of a class.

  • Adding or removing inner classes.

  • Changing the access specifiers of a field. Serialization does not respect access protection.

  • Changing a field from static to nonstatic or transient to nontransient. This is the same as adding a field.

The following changes are incompatible and thus prevent deserialization of serialized objects:

  • Changing the name of a class.

  • Changing the type of an instance field.

  • Changing the superclass of a class. This may affect the inherited state of an object.

  • Changing the writeObject( ) or readObject( ) method (discussed later) in an incompatible fashion.

  • Changing a class from Serializable to Externalizable (discussed later) orExternalizable to Serializable.


为了检测是否是同一版本,为其生成了SUID。

它长这样:

serialVersionUID = 5590355372728923878,


11 自定义序列化格式

最简单的自定义方法就是决定哪些需要增加trasient


如果,你要做的更多,重写readObject( ) and writeObject( )


或者,你也可以实现java.io.Externalizable来实现对序列化完全的控制。


Externalizable提供了额外的两个方法:

public void writeExternal(ObjectOutput out) throws IOException
public void readExternal(ObjectInput in)
  throws IOException, ClassNotFoundException

提供了更加精准的控制。


12 合法性验证

保存值的状态远远不够,你还需要验证它。


13 封装对象

提供了对于序列化对象的加密

public class SealedObject extends Object implements Serializable


Spring Boot 菜鸟教程 7 EasyUI datagrid jQueryEasyUI jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的javascript,也不需要对css样式有深入的了解,开发者需要了解的只有一些简单的html标签。 案例使用EasyUI插件 datagrid:向用户展示列表数据。 dialog: 阅读详情

相关推荐

树莓派4B安装 ubuntu20.04 & VNC远程桌面 & 安装ROS noetic

树莓派4B安装ubuntu20.04 & VNC远程桌面1、安装ubuntu方式1:下载Imager文件。方式2:下载镜像文件。2、查询树莓派 IP 地址3、使用ssh远程登录树莓派4、更新源地址5、更新6、安装桌面环境7、允许root登陆8、登陆远程桌面9、设置中文 1、安装ubuntu 方式1:下载Imager文件。...

weixin_44415639的博客 2万+

2021-04-05

项目场景: ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(“1.txt”)); Student s1=new Student(“张三”,18); oos.writeObject(s1); 问题描述: public class NotSerializableException extends ObjectStreamException抛出一个实例需要一个Serializable接口。 序列化运行时或实例的类可能会抛出此异常

HCZ_hhh的博客 109

ISP图像处理Verilog仿真框架搭建(附代码)

基于Verilog的图像处理仿真框架搭建

路漫漫其修远兮,吾将上下而求索 1896

java.io.NotSerializableException 两种解决方案:一是针对自己定义类解决方案,二是针对远程调用第三方类解决方案。

本文章转载自:https://examples.javacodegeeks.com/java-basics/exceptions/java-io-notserializableexception-how-to-solve-not-serializable-exception/ About Sotirios-Efstathios Maneas Sotirios-Efstathios (Sta...

weixin_41267342的博客 1万+

k8s 查看cpu使用率最高的pod

在 Kubernetes 中,可以使用命令查看 Pod 的资源使用情况,从而找到 CPU 使用率最高的 Pod。

u010674101的专栏 3344

01-FreeSWITCH 的安装、部署、配置以及可能遇到的问题和解决方法

一文让您了解从FreeSWITCH 的安装、部署、配置、可能遇到的问题及解决方法。一切从实际项目出发,以工程应用为目的。

秋风的博客 2127

Java 日看一类(34)之IO包中的NotActiveException和NotSerializableException

NotActiveException异常类无引入包继承自ObjectStreamException类头注释如下:* Thrown when serialization or deserialization is not active.大意为:当序列化和反序列化不活动时抛出该类含有如下的成员变量:序列化IDprivate static final long serialVersionUID = -3...

github_37666068的博客 923

分位数映射数据后处理-Quantile Mapping后处理 (R语言)

统计后处理器基本上是统计模型,将观察到的关注变量与从气象或水文模型的直接模型输出(DMO)导出的适当预测变量相关联。统计后处理的重要性早已在气象预报中得到认可。早期的工作包括完善的预测(perfect prognosis),模型输出统计(MOS)和模拟方法(analog method)等模型。 近年来,已经提出了许多其他后处理方法,包括秩直方图校准(rank histogram calibrati...

水滴石穿,绳锯木断 1万+

对象序列化

有时候需要将对象保存到磁盘wen'jia

白驹过隙 642

【宝藏级】全网最全的Pandas详细教程(2万字总结)

【回炉重造】Python之Pandas详细教程前言为什么要学习pandas?什么是Pandas?官网1. Pandas的索引操作索引对象Index {#索引对象index}1. Series和DataFrame中的索引都是Index对象2. 索引对象不可变,保证了数据的安全常见的Index种类Series索引 {#series索引}1. index 指定行索引名2. 行索引3. 切片索引4. 不连续索引5. 布尔索引DataFrame索引1. columns 指定列索引名2. 列索引3. 不连续索引高级索引

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 6万+

DataEase 未授权+远程代码执行漏洞复现(CVE-2025-49001、CVE-2025-49002)

DataEase 是一款开源的数据分析平台,提供丰富的数据可视化和分析功能,帮助用户轻松地进行数据探索和决策支持。近日,有关DataEase 被爆出多个漏洞,其中 CVE-2025-49001 是由于JWT校验机制错误导致攻击者可伪造JWT令牌绕过身份验证流程,CVE-2025-49002 是由于H2数据库模块没有严格过滤用户输入的JDBC连接参数,可使用大小写绕过补丁。攻击者可利用这些漏洞实现未授权代码执行,威胁用户数据和系统的安全。

李同學AI安全 1947

[VB.NET]新手请教:根据DATAGRID实现进度图表,请高手帮忙!

<!--google_ad_client = "pub-8333940862668978";/* 728x90, 创建于 08-11-30 */google_ad_slot = "4485230109";google_ad_width = 728;google_ad_height = 90;//--><script type="text/javascript"

VB.NET学习网-VB.NET实例、VB.NET教程、VB.NET源码下载 682

Python 爬虫实战:豆瓣 / IMDB 电影数据抓取(评分 + 剧情 + 演员阵容结构化处理)

在数据为王的时代,电影数据是进行市场分析、推荐系统构建和学术研究的重要资源。豆瓣和 IMDB 作为国内外最具影响力的电影评分和资讯网站,包含了海量高质量的电影数据。本文将带领你从零开始,构建一个健壮的 Python 爬虫,用于抓取豆瓣和 IMDB 的电影信息,并将其中的非结构化数据(如剧情简介、演员列表)进行清洗和结构化处理,最终存储到便于分析的结构化文件(如 CSV)中。

yansideyucsdn的博客 953

easyui datagrid-filter数据网格过滤的汉化

最近在研究easyui  ,写了一些界面 ; 在做网格表格datagrid-filter的时候遇到个数据过滤的操作,好多客户都是英文不好的,这可怎么办呢。这就需要程序员汉化了。 首先,我们来看一下,在easyui下下来的源码是什么样子的。如下图, 其实汉化很简单,大神就请悄悄走过吧,菜鸟都可以看看 。 1、这个网格的datagrid是需要datagrid-filter.js,这个j

程序员的博客 7334

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

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

利用.net 中数据绑定向导将数据绑定到datagrid当中(菜鸟学习笔记)

1.拖入数据控件sqldataadapter,进行数据连接,选择数据库,选择要显示的table和相应的数据,完成以后自动生成一个sqlconnection。2.点击数据菜单-生成数据集,选择系统默认的。3.拖入dataview控件,在table属性中设置属性,选择数据源为刚才所生成的数据集。4.拖入datagrid控件,右键-属性生成器,数据源选择刚才设置的dataview。后面的设置

JYYCOM的专栏 1009

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

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

菜鸟入门,easyui datagrid装载json数据时日期格式解析

把bean对象转换成json对象: import net.sf.json.JsonConfig; JsonConfig config = new JsonConfig(); config.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor()); JSONArray jsonArray = JSONArray.

u013538166的专栏 519

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

spring boot easyui菜鸟教程(01)——datagrid增删改查

1. 项目结构: 2. controller//查询商品信息,返回json @RequestMapping(value = "/findProductJson") @ResponseBody public List<Product> findProductJson(Map map){ List<Product> productList=productServ

fengcai0123的专栏 4336

【UI集锦】EasyUI-datagrid分页查询前端显示

数据表格对于做项目来说尤其是后台,是经常遇到的。便于人们对数据的分析和操作。EasyUIdatagrid数据表格,有两种方式可以实现,一种是用JSP写,另一种是用JS拼表格。     第一种:JSP代码  <table class="easyui-datagrid" id="dg" " data-options="rownumbers:true,singleSelect:false,p

IT Girl 2614

wince PDA 关于DataGrid 绑定、列宽 及“值不在预期的范围内”异常

最近刚接触PDA开发,做了一个小程序,我是这样实现的。列表页在form_load方法中绑定datagrid的数据,然后在新窗体中修改或增加一行新的数据,利用委托实现列表页的及时更新。 菜鸟心得,刚接触winform或者pda开发的朋友也许会有些帮助。不对的地方请不吝批评指正。 DataTable dt= bwork.GetWorks(" 1=1 ").Tables[0]...

dia6934的博客 175

jQuery EasyUI教程之datagrid应用(三)

今天继续之前的整理,上篇整理了datagrid的数据显示及其分页功能 获取数据库数据显示在datagrid中:jQuery EasyUI教程之datagrid应用(一) datagrid实现分页功能:jQuery EasyUI教程之datagrid应用(二) 接下来就是数据的增删改查了,首先我们在页面中添加功能按钮 这里很简单就是datagrid的toolbar属性 ...

diaolianxian9049的博客 186

easyui的datagrid生成合并行,合计计算价格

easyui的datagrid生成合并行,合计计算价格

Love丶兰的博客 2万+

easyUI 1.3.2 dataGrid动态绑定列名和数据

修改easyUI 1.3.2源码使列名可以通过后台设定

sxlxmh1314的专栏 1262

统计easyui datagrid某列之和显示在对应列下面

项目需求要在表格下面加一行统计求和的,结果网上搜寻了一堆,要么说的不详细,高深大牛们的见解;要么实现不了,搜寻老半天修改出一个可以用的,做一下学习记录,新手菜鸟,欢迎指正和新解决方案。 最终效果图: JS代码 editcount = 0; var objTable=$("#personManage"); objTable....

anxingshe3043的博客 159

菜鸟级问题!!谁能告诉我这样自动生成DataGrid

 谁能告诉我这样自动生成DataGrid???   有代码给我看看吗? 各位大哥大姐

a115468909的专栏 331
上一篇: Java I/O全文摘要(十一)过滤流,JAR归档
下一篇: AsyncTask源码分析 & 深层次BUG
computer165
博客等级 码龄16年 7粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值