序列化

Java编程的逻辑 (62) - 神奇的序列化

送分小仙女□ 提交于 2020-03-24 01:14:05
在前面几节,我们在将对象保存到文件时,使用的是DataOutputStream,从文件读入对象时,使用的是DataInputStream, 使用它们,需要逐个处理对象中的每个字段,我们提到,这种方式比较啰嗦,Java中有一种更为简单的机制,那就是序列化。 简单来说,序列化就是将对象转化为字节流,反序列化就是将字节流转化为对象。在Java中,具体如何来使用呢?它是如何实现的?有什么优缺点?本节就来探讨这些问题,我们先从它的基本用法谈起。 基本用法 Serializable 要让一个类支持序列化,只需要让这个类实现接口java.io.Serializable,Serializable没有定义任何方法,只是一个标记接口。比如,对于57节提到的Student类,为支持序列化,可改为: public class Student implements Serializable { String name; int age; double score; public Student(String name, int age, double score) { ... } ... } 声明实现了Serializable接口后,保存/读取Student对象就可以使用另两个流了ObjectOutputStream/ObjectInputStream。 ObjectOutputStream

java创建对象的几种方式

。_饼干妹妹 提交于 2020-03-23 18:53:03
前言,今日面试被问到创建对象是否一定要通过构造器,当时回答错误,查询分析后记录。 创建对象的几种方式: 第一种,也是最常用、一直接触到的方法:通过new 创建对象。这种方法需要用到构造器    Demo demo1=new Demo();    Demo demo2=new Demo(1,"有参构造器"); 第二种,比较常用的的方法: 通过反射 newInstance()创建对象。 这种方法用到构造器   Demo demo2=(Demo) Class.forName("Demo").newInstance(); 第三种,通过object类的clone方法。 需要实现Cloneable接口,重写object类的clone方法。无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。 用clone方法创建对象并不会调用任何构造函数。(原型模式,还没了解)   Demo demo4=(Demo) demo2.clone(); 第四种,反序列化。 java 中常常进行 JSON 数据跟 Java 对象之间的转换,即序列化和反序列化。 当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口,虽然该接口没有任何方法

protobuf数据描述语言

☆樱花仙子☆ 提交于 2020-03-23 15:35:01
1.简介 Protocol Buffers是Google开发的一种数据描述语言,能够将数据进行序列化,可用于数据存储、通信协议等方面。 可以理解成更快、更简单、更小的JSON或者XML,区别在于Protocol Buffers是二进制格式,而JSON和XML是文本格式。 相对于XML,Protocol Buffers有如下几个优点: 1.简洁。 2.体积小,消息大小只有XML的1/10到1/3。 3.速度快,解析速度比XML快20~100倍。 4.使用Protocol Buffers的编译器,可以生成更容易在编程中使用的数据访问代码。 5.更好的兼容性,Protocol Buffers设计的一个原则就是要能够很好的支持向下或向上兼容。 使用不同的数据描述语言序列化后的字节个数比对: 使用不同的数据描述语言进行序列化以及反序列化的响应时间比对: * 数据在网络进行传输时要经历三个阶段: 发送方对数据进行序列化、网络中传输、接收方反序列化。 将对象序列化成protobuf、xml、json结构时,protobuf所占的字节数量最少、有效数据的比重最大、总数据最少,因此决定了数据在网络进行传输时所耗费的时间最少。 将对象序列化成protobuf、xml、json结构以及反序列化成对象时,protobuf所耗费的时间最少。 结论 :数据使用protobuf序列化格式能够大大提高生产效率

序列化与反序列化

让人想犯罪 __ 提交于 2020-03-23 05:07:51
1: java中序列化与反序列化 package data.seriableObject; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import data.pojo.Product; import redis.clients.jedis.Jedis; public class Serialize { // public static void main(String [] args){ // Jedis jedis = new Jedis("172.16.135.2"); // String keys = "name"; // // 删数据 // //jedis.del(keys); // // 存数据 // jedis.set(keys, "zy"); // // 取数据 // String value = jedis.get(keys); // System.out.println(value); // // //存对象 // Product p=new Product(); /

JAVA序列化浅析

徘徊边缘 提交于 2020-03-22 19:13:53
java.io.Serializable浅析    Java API中java.io.Serializable接口源码: 1 public interface Serializable { 2 }   类通过实现java.io.Serializable接口可以启用其序列化功能。未实现次接口的类无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。   Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成byte流,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了。   要想序列化对象,你必须先创建一个OutputStream,然后把它嵌进ObjectOutputStream。这时,你就能用writeObject()方法把对象写入OutputStream了。   writeObject()方法负责写入特定类的对象的状态,以便相应的 readObject()方法可以还原它。通过调用 out.defaultWriteObject 可以调用保存 Object 的字段的默认机制。该方法本身不需要涉及属于其超类或子类的状态。状态是通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入

java序列化和反序列化

烂漫一生 提交于 2020-03-22 19:05:42
原文地址:http://www.blogjava.net/sxyx2008/ 首先解释两个概念 , 何为序列化 ? 何为反序列化 ? 序列化 : 将对象转化成流的过程称为序列化 反序列化 : 将流转化成对象的过程称之为反序列化 序列化与反序列化必须遵守的原则 a) Java对象 在java中要想使一个java对象可以实现序列化与反序列化,必须让该类实现java.io.Serializable接口 java.io.Serializable接口定义如下: public interface Serializable { } 从上述定义中可以看到该接口中未定义任何方法,这大大的简化了开发者 b) 序列化主要依赖java.io.ObjectOutputStream类,该类对java.io.FileOutputStream进一步做了封装,这里主要使用ObjectOutputStream类的writeObject()方法实现序列化功能 Demo: /** *将对象序列化到磁盘文件中 * @param o * @throws Exception */ public static void writeObject(Object o) throws Exception{ File f= new File("d:""user.tmp"); if (f.exists()){ f.delete(); }

在服务器端生成 Word 2007 文档

柔情痞子 提交于 2020-03-22 08:49:20
直到现在,编写和部署服务器端的能够读取、修改和生成 Microsoft ® Office 应用程序所使用的文档的应用程序仍然是个挑战。Microsoft Word、Excel ® 和 PowerPoint ® 所用的较早的二进制格式是在 1997 年开始使用的,直到在 Office 2003 版中仍然将其作为默认文件格式。然而,这种二进制的文件格式已被证明因过于棘手而不便使用。大多数读写 Office 文档的生产应用程序都通过承载 Office 应用程序的对象模型来达到此目的。 使用应用程序(如 Word 或 Excel)的对象模型的应用程序和组件,在桌面机上的运行状况远远好于在服务器端环境中。任何曾花费时间编写额外的基础代码来让 Office 桌面应用程序在服务器上可靠运行的人都会告诉您,那绝对不是理想的解决方案。这是因为,Word 和 Excel 之类的 Office 桌面应用程序的设计初衷从来就不是使其在服务器上运行,每当遇到需要人工干预的频繁的对话时,就需要用一个自定义实用程序来终止并重新启动它们。 对于服务器端而言,无需采用承载 Office 应用程序的对象模型的方法即可读写 Office 文档的能力已变为极需要的趋势。Office 2000 和 Office 2003 都引入了一些模型化的功能,可使用 XML 来创建 Excel 工作簿和 Word 文档

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

时光毁灭记忆、已成空白 提交于 2020-03-22 08:06:39
JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据。说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象。要添加System.Web.Extensions.dll的引用。该类位于System.Web.Script.Serialization命名空间下。 一、属性 MaxJsonLength 获取或设置 JavaScriptSerializer 类接受的 JSON 字符串的最大长度。 RecursionLimit 获取或设置用于约束要处理的对象级别的数目的限制。 二、方法 ConvertToType<(Of <(T>)>) 将给定对象转换为指定类型。 Deserialize<(Of <(T>)>) 将指定的 JSON 字符串转换为 T 类型的对象。 DeserializeObject 将指定的 JSON 字符串转换为对象图。 RegisterConverters 使用 JavaScriptSerializer 实例注册自定义转换器。 Serialize 已重载。 将对象转换为 JSON 字符串。 给个示例,主要就是了解了一下Serialize与Deserialize两个方法,控制器代码: public class HomeController : Controller { public

days-2

随声附和 提交于 2020-03-22 07:48:17
文件和异常 实际开发中常常会遇到对数据进行 持久化 操作的场景,而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词,可能需要先科普一下关于 文件系统 的知识,但是这里我们并不浪费笔墨介绍这个概念,请大家自行通过维基百科进行了解。 在Python中实现文件的读写操作其实非常简单,通过Python内置的 open 函数,我们可以指定文件名、操作模式、编码信息等来获得操作文件的对象,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件(字符文件还是二进制文件)以及做什么样的操作(读、写还是追加),具体的如下表所示。 操作模式 具体含义 'r' 读取 (默认) 'w' 写入(会先截断之前的内容) 'x' 写入,如果文件已经存在会产生异常 'a' 追加,将内容写入到已有文件的末尾 'b' 二进制模式 't' 文本模式(默认) '+' 更新(既可以读又可以写) 下面这张图来自于 菜鸟教程 网站,它展示了如果根据应用程序的需要来设置操作模式。 读写文本文件 读取文本文件时,需要在使用 open 函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为 'r' (如果不指定,默认值也是 'r' ),然后通过 encoding 参数指定编码(如果不指定,默认值是None,那么在读取文件时使用的是操作系统默认的编码)

模块和常用内置模块

故事扮演 提交于 2020-03-22 07:31:07
什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译为共享库或DLL的C或C++扩展 3 包好一组模块的包 4 使用C编写并链接到python解释器的内置模块 为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。 随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用, 模块的导入和使用 模块的导入应该在程序开始的地方。 常用语法 我们可以在py文件中按照如下方式导入模块: import a from xx import b 当然还可以再导入模块的时候给模块起别名 from xx import heiheihei as yue __name__ 当做脚本运行: __name__ 等于'__main__' 当做模块导入: __name__= 模块名