为什么需要序列化

为什么要序列化? 序列化就是将数据结构或java对象转换成二进制串的过程,将数据或信息以字节的形式表示出来。 阅读详情

为什么需要序列化

注意:“为避免编译错误,为可序列化的类添加了无参数构造函数。”

MSDN的定义:序列化是将对象状态转换为可保持或可传输的形式的过程。序列化的补集是反序列化,后者将流转换为对象。这两个过程一起保证数据易于存储和传输。

大家关心的是为什么需要序列化,用传统的方法也能实现这种需求吗,它存在的价值是什么,低层的原理、实质、基因的区别是什么?这也是我的疑问,通过在网上搜集,找到了较满意的答案,分享给大家。

答案一:序列化是用来通信的,服务端把数据序列化,发送到客户端,客户端把接收到的数据反序列化后对数据进行操作,完成后再序列化发送到服务端,服务端再反序列化数据后对数据进行操作。说白了,数据需要序列化以后才能在服务端和客户端之间传输。这个服务端和客户端的概念是广义的,可以在网络上,也可以在同一台机器的不同进程中,甚至在同一个进程中进行通信。在传统编程中,对象是通过调用栈间接的与客户端交互,但在面向服务的编程中,客户端永远都不会直接调用实例。不知道说的明不明白。 

好吧,我说的确实不够明白,你问的是为什么需要序列化,我只是说了序列化的一个应用。那我就来说说序列化的好处吧。不序列化也可以传输,但是无法跨平台,安全性也无法保障。我说的是面向服务编程中的作用,在传统编程中,你在表示层实例化一个业务对象,然后调用业务对象中的方法,你想过为什么能这样调用吗?这样做耦合度太高,很不好。如果序列化以后通过特定的协议传输数据就不一样了,表示层通过代理或通道向服务层发送特定的数据格式,这个数据就是序列化以后的,比如XML,服务端接收到以后要进行反序列化,生成服务端可识别的数据格式,比如一个类,然后对数据进行操作,再序列化发送到客户端,客户端再反序列化。这样客户端可以使用和服务端完全不同的开发平台,只要它能够对xml数据进行反序列化,而xml是具有工业标准的数据格式,基本各平台都支持。这也适用于在进程间通信。如果在进程内通信,也可以做到更高的安全性,对象不再通过调用栈交互,而是通过代理或通道。

转自:http://zhidao.baidu.com/question/311731521.html

答案二:这个更进一步的解释了其真正的价值。

简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的! 

问题的引出: 

如上所述,读写对象会有什么问题呢?比如:我要将对象写入一个磁盘文件而后再将其读出来会有什么问题吗?别急,其中一个最大的问题就是对象引用!举个例子来说:假如我有两个类,分别是A和B,B类中含有一个指向A类对象的引用,现在我们对两个类进行实例化{ A a = new A(); B b = new B(); },这时在内存中实际上分配了两个空间,一个存储对象a,一个存储对象b,接下来我们想将它们写入到磁盘的一个文件中去,就在写入文件时出现了问题!因为对象b包含对对象a的引用,所以系统会自动的将a的数据复制一份到b中,这样的话当我们从文件中恢复对象时(也就是重新加载到内存中)时,内存分配了三个空间,而对象a同时在内存中存在两份,想一想后果吧,如果我想修改对象a的数据的话,那不是还要搜索它的每一份拷贝来达到对象数据的一致性,这不是我们所希望的! 

以下序列化机制的解决方案: 

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

2.当要保存一个对象时,先检查该对象是否被保存了。 

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

通过以上的步骤序列化机制解决了对象引用的问题! 

序列化的实现 

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。 



在序列化的过程中,有些数据字段我们不想将其序列化,对于此类字段我们只需要在定义时给它加上transient关键字即可,对于transient字段序列化机制会跳过不会将其写入文件,当然也不可被恢复。但有时我们想将某一字段序列化,但它在SDK中的定义却是不可序列化的类型,这样的话我们也必须把他标注为transient,可是不能写入又怎么恢复呢?好在序列化机制为包含这种特殊问题的类提供了如下的方法定义: 

private void readObject(ObjectInputStream in) throws 

IOException, ClassNotFoundException; 

private void writeObject(ObjectOutputStream out) throws 

IOException; 

(注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的) 

使用以上方法我们可以手动对那些你又想序列化又不可以被序列化的数据字段进行写出和读入操作。 

下面是一个典型的例子,java.awt.geom包中的Point2D.Double类就是不可序列化的,因为该类没有实现Serializable接口,在我的例子中将把它当作LabeledPoint类中的一个数据字段,并演示如何将其序列化! 

import java.io.*; 

import java.awt.geom.*; 

public class TransientTest 

{ 

         public static void main(String[] args) 
         { 
                 LabeledPoint label = new LabeledPoint("Book", 5.00, 5.00); 
                 try 
                 { 
                         System.out.println(label);// 写入前 
                         ObjectOutputStream out = new ObjectOutputStream(new 
                         FileOutputStream("Label.txt")); 
                         out.writeObject(label); 
                         out.close(); 
                         System.out.println(label);// 写入后 
                         ObjectInputStream in = new ObjectInputStream(new 
                         FileInputStream("Label.txt")); 
                         LabeledPoint label1 = (LabeledPoint) in.readObject(); 
                         in.close(); 
                         System.out.println(label1);// 读出并加1.0后 
                 } 
                 catch (Exception e) 
                 { 
                         e.printStackTrace(); 
                 } 
         } 
} 

class LabeledPoint implements Serializable 
{ 
         public LabeledPoint(String str, double x, double y) 
         { 
                 label = str; 
                 point = new Point2D.Double(x, y); 
         } 

         private void writeObject(ObjectOutputStream out) throws IOException 
         { 
                 

                 out.defaultWriteObject(); 
                 out.writeDouble(point.getX()); 
                 out.writeDouble(point.getY()); 
         } 

         private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException 
         { 
                 
                 in.defaultReadObject(); 
                 double x = in.readDouble() + 1.0; 
                 double y = in.readDouble() + 1.0; 
                 point = new Point2D.Double(x, y); 

         } 

         public String toString() 
         { 
                 return getClass().getName()+ "[label = " + label+ ", point.getX() = " + point.getX()+ ", point.getY() = " + point.getY()+ "]"; 
         } 
         private String label; 
         transient private Point2D.Double point; 
}转自:  http://blog.sina.com.cn/s/blog_5b142cae0100clon.html

总结:对象序列化,就是保证多处需要使用的对象,如果是同一个,就只实例化一次,这样,效率高,如果对象发生了变化,只要序列化的对象流发生对应的变法即可。

什么情况下使用:

有两个最重要的原因促使对序列化的使用:一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本;另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。

 参考:http://www.cnblogs.com/gaozhongfa/archive/2009/12/08/1619041.html

87面试常问:Java序列化和反序列化为什么要实现Serializable接口 最近公司的在做服务化, 需要把所有model包里的类都实现Serializable接口, 同时还要显示指定serialVersionUID的值. 听到这个需求, 我脑海里就突然出现了好几个问题, 比如说: 序列化和反序列化是什么? 实现序列化和反序列化为什么要实现Serializable接口? 实现Serializable接口就算了, 为什么还要显示指定serialVersionUID的值? 我要为serialVersionUID指定个什么值? 下面我们来一... 阅读详情

相关推荐

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

mizhiakk的博客 8405

为什么需要序列化??(转)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33884611的博客 272

实测338MB/s!FPGA与CYUSB3014的Slave FIFO模式实战避坑(附完整固件与源码)

本文详细介绍了FPGA与CYUSB3014在Slave FIFO模式下实现338MB/s高速数据传输的实战经验。通过优化硬件设计、固件配置和GPIF II接口设置,解决了USB3.0双向通信中的关键性能瓶颈,并提供了完整的固件与源码参考。

weixin_30570101的博客 457

为什么要进行序列化?Java中序列化是如何实现的?

为什么要实现序列化?Java中序列化是如何实现的? 文章目录为什么要实现序列化?Java中序列化是如何实现的?1. 序列化与反序列化的概念2. 为什么要进行序列化2.1 网络传输2.2 对象持久化2.3 实现分布式对象3. 序列化是如何实现的?3.1 Java原生序列化3.2 使用第三方的序列化方式4. 注意点 1. 序列化与反序列化的概念 序列化:序列化是一种用来处理对象流的机制,所谓对象流就是将对象的内容进行流化,将数据分解成字节流,以便让我们存储在文件中或者是在网络上进行传输。简单来说就是把Java对

qq_50094213的博客 2360

nCode:GlyphWorks案例教程一

nCode GlyphWorks案例一Comparing Frequency Content of Two Different Tests案例文件目标配置选择数据 Comparing Frequency Content of Two Different Tests 在本案例中,我们将比较来自两个不同测试的六个加速计通道的频率内容。将三轴加速度计放置在车辆的左前角和右前角,然后分别在两个不同的试验路面上行驶12分钟以上。 案例文件 此案例的文件(采用nCode DAC格式)位于nCode安装目录下的\demo

追月行的博客 1万+

GitHub与GitLab中的Fork操作:从个人仓库到团队协作的完整指南

本文详细介绍了GitHub与GitLab中的Fork操作,从个人仓库到团队协作的完整指南。通过Fork操作,开发者可以在权限隔离的环境下自由实验,并通过合并请求机制保证代码质量。文章涵盖了Fork的具体步骤、本地开发环境配置、代码同步方法以及高级协作技巧,帮助团队高效管理代码仓库。

weixin_28829325的博客 306

为什么需要序列化?什么时候需要序列化?

1.序列化就是用来通信的,java中所有参数或类对象中的数据的传递都是指向内存中的地址值。假如你存地址入库,你再去这个地址拿数据需要把内存哪吒脑海搞一次。并且你直接拿地址也不安全。 如此传输数据就必须遵守相对应的协议,这就要求你序列化后再传输实体的数据。 2.customer拿到provider序列化的数据,反序列化后进行增删查改再序列化给provider。 如果你在不同的项目下需要调用 ...

3828

解决QT5调用软键盘qvirtualkeyboard时崩溃问题ime_pinyin::MatrixSearch::init_user_dictionary

但是偶尔也会出现问题,譬如,我这边在Arm系统上跑着程序的时候,点击用户编辑框,输入法弹出,但是再次点击密码输入框,连程序都给我崩溃了。只是提示错误:void ime_pinyin::MatrixSearch::init_user_dictionary。首先确保你的Arm版QT库已经编译了软键盘,位置有时候就和lib同级目录,qtvirtualkeyboard。QT5中的软键盘qvirtualkeyboard很好用,很多人开发嵌入式端应用的时候都会用到。此外还有很多其他的输入法字典,像。

有问题或资源连接有缺失的可以私信公众号新潮看世界获取 2063

为什么需要序列化,以及序列化的一些操作【收录】

  序列化主要用在数据持久化和远程调用     序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。 我想最主要的作用有: 1 、在进程下次启动时读取上次保存的对象的信息  2 、在不同的AppDomain 或进程之间传递数据  ...

yfdong21_2009的博客 200

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 983

基于ESP32的智能健康监测系统开发

本文介绍了如何基于ESP32开发智能健康监测系统,从硬件选型、系统架构到软件实现的每一个环节。通过ESP32的Wi-Fi功能、传感器模块和云平台的结合,我们实现了实时健康数据监测、远程查看、报警等功能。系统的低功耗特性使得其适用于长期健康监测,能够为用户提供更便捷的健康管理方案。随着技术的不断发展,未来智能健康监测系统将进一步发展。例如,增加更多的传感器,提升数据分析能力,甚至通过人工智能算法来预测用户的健康趋势,为用户提供个性化的健康建议。

2201_76125393的博客 1104

XML序列化以及反序列化

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; using System.Threading; using System.Xml.Serialization; using System.IO; namespace

sww54088的专栏 614

华为 MetaERP 通过元数据驱动的多组织架构 + 内部交易协同 + 自动对账引擎 + 合并规则引擎,实现多组织内部往来与合并报表的全流程自动抵消,核心是源头标准化、过程自动化、结果可追溯

摘要: 华为MetaERP通过元数据驱动的多组织架构与主数据标准化,实现内部往来与合并报表全流程自动化。其核心包括:统一组织模型与主数据(确保数据口径一致)、内部交易协同(自动生成对称凭证)、智能对账引擎(多维度自动匹配差异)、合并规则引擎(配置化抵消模板)。依托GaussDB高性能数据库与流批一体架构,华为全球88家子公司合并报表效率提升400%,关账时间缩短至2小时,支持多准则、多币种自动抵消,审计全程可追溯。相比传统ERP,MetaERP在协同性、自动化与扩展性上优势显著,为跨国集团提供高效、准确的合

金牌架构师 264

什么是序列化,为什么要序列化。

转自:网络--(忘记从哪看到的了) 整理:Bob 在学习分布式计算的时候,老师上课提到序列化这个概念。当时有些懵逼,不知道 什么是序列化,下来查了一下,原来在Java里面,序列化就是和Serializable接口相关的 东西。 以下是我从网上找到的关于,什么是序列化,为什么要序列化解释的比较好的一篇博文。 ================================

Bob的博客 4万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java 为什么序列化_java基础知识——为什么需要序列化

在做java开发的时候,经常需要在对象上加序列化即实现implements Serializable 接口,这个接口没有任何的方法需要实现。这么做的目的是干什么的?这个目的在于,他做了一个标志,表示这个类是可以被用来序列化的,可以进行网络传输,可以以二进制的形式保存在文件系统中。Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程。那...

weixin_30750685的博客 477

OV9734 DATASHEET,完整规格书

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

为什么要序列化

序列化接口

qq_58622340的博客 174

计算机控制技术及应用

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

Java 序列化和反序列化为什么要实现 Serializable 接口

我们在开发时,需要把所有model包里的类都实现Serializable接口, 同时还要显示指定serialVersionUID的值. 听到这个需求, 我脑海里就突然出现了好几个问题, 比如说:序列化:把对象转换为字节序列的过程称为对象的序列化.反序列化:把字节序列恢复为对象的过程称为对象的反序列化.当我们只在本地JVM里运行下Java实例, 这个时候是不需要什么序列化和反序列化的, 但当我们需要将内存中的对象持久化到磁盘, 数据库中时, 当我们需要与浏览器进行交互时, 当我们需要实现RPC时, 这个时候就

小驴程序源 475

Java序列化和反序列化为什么要实现Serializable接口

最近公司的在做服务化, 需要把所有 model 包里的类都实现 Serializable 接口, 同时还要显示指定 serialVersionUID 的值. 听到这个需求, 我脑海里就突然出现了好几个问题, 比如说: 序列化和反序列化是什么? 实现序列化和反序列化为什么要实现 Serializable 接口? 实现 Serializable 接口就算了, 为什么还要显示指定 serialVersionUID 的值? 我要为 serialVersionUID 指定个什么值? 下面我们来一一解答这几个问题.

qq_42370505的博客 156

面试:什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?...

点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!作者 |riemann_来源 |blog.youkuaiyun.com/riemann_/article/deta...

程序猿DD 579

为什么序列化???

需要共享数据时,直接传递对象通常是不可行的,因为对象的引用无法在网络或进程边界上传输。因此,需要将对象的状态转化为一种可以传输的形式,这就是序列化的作用。

qq_64847107的博客 526

java对象为什么要序列化?

1.对象的序列化用途:   Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方 把该Byte 流里的数据读出来。重新构造一个相同的对象。这种机制允许你将对象通过网络 进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的序列化机制是RMI、 EJB、JNNI等技术的技术基础。 2.序列化的特点: (1)如果某个类能够被序列化,其子类也

mafly008的专栏 1362

什么是序列化,为什么需要序列化

什么是序列化,为什么要序列化,如何实现序列化,几种序列化性能比较

shiluoxuan的博客 1711

什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。

遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化 b,作用。为啥要实现这个 Serializable 接口,也就是为啥要序列化 c,serialVersionUID 这个的值到底是在怎么设置的,有什么用。有的是1L,有的是一长串数字,迷惑ing。 我刚刚见到这个关键字 Serializable 的时候,就有如上的这么些问题。 在处理这...

riemann_的博客 3万+

为什么需要序列化总结

此处大纲: 1、什么叫序列化 2、为什么需要序列化 3、序列化过程 4、序列化的实现 5、JavaBean被序列化的内容 6、序列化对象创建机制 7、想序列化又不可以被序列化的数据字段进行写出和读入操作 1、什么叫序列化 序列化是一种处理对象流的机制——把内存中的Java对象转换成二进制流,对象流化后,将对象内容保存在磁盘文件中或作为数据流进行网络传输。简单来说,序列化是将对...

山月风成的博客 4343

什么是序列化 怎么序列化 为什么序列化

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

MARKPAIN的专栏 8555
上一篇: android 中实现图片倒影效果
下一篇: android 使用post 提交
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值