为什么要使用序列化

在日常的程序开发中,用到了很多次的序列化的数据,可是一直不清楚为什么要将数据序列化,经过一段时间的学习与验证,有了一些个人看法,在这里做个总结,权当抛砖引玉了。

为什么要将数据序列化?个人认为,可以从两个方面来解释,一方面是为了方便数据存储,另一方面是为了方便数据的传递。

通常我们的数据会存放到数据库中,但是,数据库存储数据也是有限制的,我们也不能将所有数据都存放到数据库中吧。假如说程序中有这么一种数据,在整个程序运行过程中,这些数据能且只能使用一次,使用过后就会改变或者无效,并且,数据量比较大,且数据不重复,那么,我们应该如何设计数据库呢?首先,数据不重复,也就不存在将这些数据存放到一张表中,可是,我们有不能为每个中间数据单独的建立一张数据表,这样太浪费了,那么序列化便应运而生。

首先,我们将所有需要存储的中间数据序列化,然后将序列化后的数据保存到数据库的一个字段中,然后为这个表设置一个主键即可。是不是很方便呢?且看数据库保存形式。

我们可以看到,XML形式的数据其实可以当作链接,点击后,即可在数据库中查看相应内容,查询的时候,直接使用主键查询,然后将查询结果反序列化即可。

第二个方面是数据传递,程序之间的数据传递,窗体之间的数据传递等,我这里主要以前后台之间的数据传递为例,说明序列化的好处。

现在,我们要将一个实体从后台传递到前台进行逻辑计算,或者将前台的实体数据传递到后台,我们应该怎么做呢?

比较明智的办法就是将数据绑定到隐藏域控件上,然后在控件上取值,假如我们的实体包括很多字段怎么办呢?总不至于每个字段对应一个隐藏域吧,于是,序列化又有大展拳脚了。我们可以将实体序列化,然后在赋值到隐藏域,获取数据后,反序列化即可。

序列化以前的后台数据

后台数据序列化以后:

前台获取数据形式,通过对象监控,获取控件返回值。

可见,获取到底额数据还是序列化以后的格式,然后进行反序列化即可得到原来的实体数据。监控可知:

数据又还原到了实体格式,这样是不是很方便呢?

综上所述,序列化好处:

1 方便数据传递,减少了数据丢失率,增强了程序安全性。

2 有利于数据存储,减少了不必要的内存浪费,节约了资源。

3 简化了数据库结构,增强了程序的可维护性。

时间: 2024-10-14 12:13:31

为什么要使用序列化的相关文章

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

C#中XML与对象之间的序列化、反序列化

using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Xml.Utility { public static class XmlUtil { /// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <param name="o">要序列化

二叉树的序列化和反序列化

http://blog.csdn.net/qq_27703417/article/details/70958692 先序遍历二叉树,如果遇到空节点,就在str的末尾加上"#!","#"表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,"!"表示一个值的结束.如果遇到不为空的节点,假设节点值为3,就在str的末尾加上"3!".现在请你实现树的先序序列化. 先序遍历 import java.util.*; //使用递归

Java复习——I/O与序列化

File类 java.io.File只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问,我们可以通过通过给其构造函数传一个路径来构建以文件,传入的路径名有一个小问题,就是Windows和UNIX 中的路径分隔符斜杠方向的问题:"/" 表示 UNIX 中的根目录,"\" 表示Windows 的根目录.File类有静态的参数可以很简单的解决这个问题:pathSeparator就是其中一个.File类中常用的方法有: exists():测试此抽象路径名表

Java 深拷贝浅拷贝 与 序列化

一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会进行拷贝:(引用的对象只要求浅拷贝即可:若要深层拷贝,一般可利用序列化和反序列化来实现,也可手动实现各级引用对象的深层拷贝:) 二.实现: 浅拷贝:实现Cloneable接口,重写clone()方法,在clone()调用父类super.clone()即可: 深拷贝:1. 实现Cloneable接口,

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

序列化与反序列化

对象的序列化,反序列化 1)对象序列化,就是将Object转化为byte序列,反之叫对象的反序列化 2)序列化流(ObjectOutputStream),是过滤流----writeObject() 反序列化流(ObjectInputStream)------readObject() 3)序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准

NET(C#):XmlArrayItem特性和XmlElement特性在序列化数组的差别

https://www.mgenware.com/blog/?p=142 比如这样一个类,我们用XmlArrayItem特性标明数组内出现的元素类型: public class a{ [XmlArrayItem(Type = typeof(int)), XmlArrayItem(Type = typeof(Guid)), XmlArrayItem(Type = typeof(string))] public object[] arr = new object[] { 12, "hehe"

java 实现序列化的两种方式

序列化是把java对象以字节流的形式写入硬盘或传给网络中的其他计算机. 方式一:实现Serializable借口.该接口是一个空借口,仅用于标识该对象可以被序列化,以便jre对其做封装. 方式二:实现Externalizable借口.该接口继承自Serializable借口,添加了两个方法 writeExternal()/readExternal(),在writeExternal()方法中可以指定需要序列化的属性,实现部分序列化

Flink资料(4) -- 类型抽取和序列化

类型抽取和序列化 本文翻译自Type Extraction and Serialization Flink处理类型的方式比较特殊,包括它自己的类型描述,一般类型抽取和类型序列化框架.该文档描述这些概念并解释其机理. Java API和Scala API处理类型信息的方式有根本性的区别,所以本文描述的问题仅与其中一种API相关 一.Flink中对类型的处理 一般处理类型时,我们并不干涉,而是让编程语言和序列化框架来自动处理类型.与之相反的,Flink想要尽可能掌握进出用户函数的数据类型的信息. 1