- 浏览: 797056 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (480)
- Spring (12)
- Hibernate (8)
- Struts2 (4)
- Java 基础-JDK-类-接口-URI-专题研究 (27)
- 线程、线程池、多线程高并发高可用、Socket通信 (15)
- Oracle数据库 (20)
- 一般-前端js-html-其它 (25)
- JYSK-互联网金融、金融科技、支付、公司、新闻等等 (8)
- Ajax-jQuery开源框架 (7)
- Json-轻量级的数据交换格式 (14)
- JavaScript (15)
- Jsp、Servlet、Servlet+JSP+JavaBean开发模式(MVC) (18)
- Html-JavaScript-前端-调用接口 (12)
- Sql Server 2005 (6)
- 正则表达式 (2)
- Java tools (18)
- 加签与验签、加密与解密 (3)
- Ajax技术核心-xmlHttpRequest(简称XHR) (6)
- xml-数据交换格式 (3)
- 信息采集 (1)
- Http - Https - HttpClient - httpCore-SSL-TLS (10)
- HtmlParser (2)
- 标签库 (1)
- SMS (2)
- jxl-导入导出 (4)
- poi-导入导出 (2)
- 定时器Timer+Quartz (6)
- 工作流引擎JBPM3.2.3 (4)
- 工作流引擎JBPM4 (0)
- 数据源-JNDI (0)
- tomcat、weblogic等应用服务器 (6)
- 工作流引擎jbpm5 (1)
- 搜索引擎Lucene (1)
- ant (1)
- 大数据-HBase (2)
- bigtable (0)
- 数据库设计 (4)
- jquery tab (0)
- mybatis (5)
- jquery ui 1.10.3 (5)
- Jboss7 (1)
- 规则引擎drools (0)
- 工作流引擎Activiti5 (0)
- 数据库-用户自定义函数 (0)
- 数据库-存储过程 (2)
- 数据库-视图 (0)
- 数据库-触发器 (0)
- 数据库-sql (2)
- highcharts-图表工具 (1)
- sql server 2008 (6)
- 诗词-工作室 (2)
- 数据割接 (1)
- GIS-地理信息系统 (2)
- RS-遥感技术 (1)
- GPS-全球定位系统 (1)
- java整合flex_RIA开发 (3)
- C#编程语言 (5)
- webservice_axis2_cxf_soap_wsdl (2)
- sql语句 (3)
- Flex_WebService_GIS (25)
- PHP编程语言 (0)
- ExtJS4.2 (1)
- Spring mvc (5)
- EasyUI1.4.2 (16)
- 日期时间工具类 (4)
- 随机数 (1)
- Arcgis api for js (0)
- Mysql数据库 (9)
- 移动互联网 java html5/flash socket netty (0)
- API接口 (1)
- AndroidStudio (0)
- Git (2)
- Maven (5)
- IDEA (0)
- 大数据-Hadoop (2)
- JPA (0)
- Spring boot (4)
- JSF (0)
- nginx_lua_module_redis (2)
- Activiti (1)
- bootstrap (1)
- AngularJS (10)
- 数据库-索引 (1)
- Linux及其连接工具SSH (4)
- java日志管理 (2)
- islider滑动控件 (1)
- jquery (1)
- 异常处理Exception (1)
- 秒杀与类秒杀系统 (1)
- 连接数据库、数据库连接池 (4)
- 数据库-临时表 (1)
- 软件设计模式-单例、多例、代理、工厂、观察者 (3)
- 集合框架 (5)
- 人工智能--Artificial intelligence、神经网络算法、机器学习 (1)
- 分布式应用 (1)
- SOA服务-Dubbo框架-Thrift框架 (2)
- Zookeeper分布式服务框架 (2)
- intellij idea (1)
- python编程语言 (0)
- 消息队列_MQ (0)
- 消息队列_RabbitMQ (2)
- 消息队列_ActiveMQ (1)
- 消息队列_Kafka (2)
- 缓存_Redis (4)
- 缓存_Memcache (0)
- 缓存_Ehcache (0)
- ivy-ivyde (1)
- google-protocol buffers (1)
- 正向代理-正向代理服务器 (1)
- 反向代理-反向代理服务器 (1)
- JVM内存模型 (0)
- Thunder框架 (1)
- NIO-非阻塞式IO (0)
- 软件测试、性能测试 (1)
- 序列化、Serializable接口、Externalizable接口 (3)
- 线程池-ExecutorService-ThreadPoolExecutor (1)
- web.xml (1)
- java开发-java工具-实用工具网站 (6)
- 医疗 (1)
- Filter-过滤器 (2)
- Unicode码-双字节字符编码 (1)
- OpenResty (1)
- 计算机网络 (1)
- eclipse_myeclipse_intellij idea (3)
- Enum (1)
- 大数据--Big Data (1)
- 云计算--Cloud computing (1)
- Elastic-Job (1)
- Redis (2)
- 文件流-IO操作 (6)
- 计算机基础知识 (1)
- Hessian-二进制RPC协议 (1)
- String类 (3)
- BigDecimal类 (1)
- java重要接口 (1)
- ReactJS (1)
- 跨域问题 (0)
- Map (1)
- 注解 (1)
- ASCII码-单字节字符编码 (1)
- 微服务、微服务架构 (2)
- RPC协议、RPC服务、RPC框架 (0)
- java反射 (1)
- java项目之classpath (1)
- 经典算法-树 (1)
- listener-监听器 (1)
- Interceptor-拦截器 (1)
- pojo javabean (2)
- 计算机科学与技术-进阶 (1)
- 代码规范与文档编写 (1)
- UML-统一建模语言 (1)
- 对接微信、支付宝 (3)
- 压力测试 (1)
- 办公软件-Excel (1)
- 办公软件-PPT (0)
- UTF8、GBK编码 (1)
- 微服务架构:Spring Cloud架构-Dubbo架构 (6)
- Nginx (1)
- 点滴业务 (1)
- form表单-json数据-转换与接口调用 (1)
- Junit单元测试 (1)
- 大数据-Spark (1)
- 大数据-Storm (1)
- 数据库事务-Spring事务 (0)
- elasticsearch (1)
- windows (1)
最新评论
java序列化的2个可实现接口Serializable、 Externalizable相关
参考博客:
http://blog.csdn.net/dreamtdp/article/details/15378329
一、Serializable demo
二、Externalizable
三、Singleton Class实现 Serializable
参考博客:
http://blog.csdn.net/dreamtdp/article/details/15378329
一、Serializable demo
public enum Gender { MALE, FEMALE }
public class Person implements Serializable{ private String name; private Integer age; transient private Gender gender; /*transient指定要忽略序列化的字段*/ public Person(){ System.out.println("without args constructor"); } public Person(String name,Integer age,Gender gender){ System.out.println("with args constructor"); this.name=name; this.age=age; this.gender=gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; } @Override public String toString() { return "重写toString()方法输出Person [name=" + name + ", age=" + age + ", gender=" + gender + "]"; } /** * 对于上述已被声明为transitive的字段age,除了将transitive关键字去掉之外, *是否还有其它方法能使它再次可被序列化?方法之一就是在Person类中添加两个方法:writeObject()与readObject(),如下所示: *必须注意地是,writeObject()与readObject()都是private方法,那么它们是如何被调用的呢?毫无疑问,是使用反射。 * @throws IOException */ private void writeObject(ObjectOutputStream oos) throws IOException{ oos.defaultWriteObject(); oos.writeObject(gender); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException{ ois.defaultReadObject(); gender=(Gender) ois.readObject(); }
public class TestSerializable { public static void main(String[] args) { File file=new File("person.out"); //写 try { ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file)); Person person=new Person("tom",22,Gender.FEMALE); oos.writeObject(person); oos.close(); System.out.println("========================"); } catch (FileNotFoundException e) { System.out.println("找不到文件"); e.printStackTrace(); } catch (IOException e) { System.out.println("执行ObjectOutputStream 报错。"); e.printStackTrace(); } //读 try { ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file)); Object newPerson = ois.readObject(); ois.close(); System.out.println("newPerson="+newPerson); } catch (ClassNotFoundException e) { System.out.println("ObjectInputStream找不到类"); e.printStackTrace(); } catch (IOException e) { System.out.println("ObjectInputStream其他异常"); e.printStackTrace(); } /** *此时必须注意的是,当重新读取被保存的Person对象时,并没有调用Person的任何构造器,看起来就像是直接使用字节将Person对象还原出来的。 *当Person对象被保存到person.out文件中之后,我们可以在其它地方去读取该文件以还原对象,但必须确保该读取程序的CLASSPATH中 *包含有Person.class(哪怕在读取Person对象时并没有显示地使用Person类,如上例所示),否则会抛出ClassNotFoundException。 */ } }
二、Externalizable
public class Student implements Externalizable{ private String name; private int age; transient private Gender gender; /** * 使用Externalizable接口时,该方法必须声明,且为public. * 若使用Externalizable进行序列化,当读取对象时,会调用被序列化类的无参构造器去创建一个新的对象, * 然后再将被保存对象的字段的值分别填充到新对象中。这就是为什么在此次序列化过程中Person类的无参构造器会被调用。 * 由于这个原因,实现Externalizable接口的类必须要提供一个无参的构造器,且它的访问权限为public。 */ public Student() { System.out.println("Student without args constructor"); } public Student(String name, int age, Gender gender) { System.out.println("Student with args constructor"); this.name = name; this.age = age; this.gender = gender; } private void writeObject(ObjectOutputStream oos) throws IOException{ oos.defaultWriteObject(); oos.writeObject(gender); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException{ ois.defaultReadObject(); gender=(Gender) ois.readObject(); } /** * Externalizable必须手动写读取内容 */ @Override public void readExternal(ObjectInput arg0) throws IOException, ClassNotFoundException { name=(String) arg0.readObject(); age=arg0.readInt(); } /** * Externalizable必须手动写输出内容 */ @Override public void writeExternal(ObjectOutput arg0) throws IOException { arg0.writeObject(name); arg0.writeInt(age); } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]"; } }
public class TestExternalizable { public static void main(String[] args) { File file=new File("person.out"); //写 try { ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file)); Student person=new Student("tom",22,Gender.FEMALE); oos.writeObject(person); oos.close(); System.out.println("========================"); } catch (FileNotFoundException e) { System.out.println("找不到文件"); e.printStackTrace(); } catch (IOException e) { System.out.println("执行ObjectOutputStream 报错。"); e.printStackTrace(); } //读 try { ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file)); Object newPerson = ois.readObject(); ois.close(); System.out.println("newPerson="+newPerson); } catch (ClassNotFoundException e) { System.out.println("ObjectInputStream找不到类"); e.printStackTrace(); } catch (IOException e) { System.out.println("ObjectInputStream其他异常"); e.printStackTrace(); } /** *此时必须注意的是,当重新读取被保存的Person对象时,并没有调用Person的任何构造器,看起来就像是直接使用字节将Person对象还原出来的。 *当Person对象被保存到person.out文件中之后,我们可以在其它地方去读取该文件以还原对象,但必须确保该读取程序的CLASSPATH中 *包含有Person.class(哪怕在读取Person对象时并没有显示地使用Person类,如上例所示),否则会抛出ClassNotFoundException。 */ } }
三、Singleton Class实现 Serializable
public class SingletonPerson implements Serializable { private String name; private Integer age; private Gender gender; /** * 对外提供实例的开发方法 * @return */ public static SingletonPerson getInstance(){ return instanceHolder.instance; } /** * 内部类 * */ private static class instanceHolder{ private static final SingletonPerson instance=new SingletonPerson("Jenny", 30, Gender.FEMALE); } /** * 单例 private修饰 */ private SingletonPerson() { System.out.println("1-constructor without arguments"); } /** * 单例 private修饰 */ private SingletonPerson(String name, Integer age, Gender gender) { System.out.println("2-constructor with arguments"); this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; } @Override public String toString() { return "SingletonPerson [name=" + name + ", age=" + age + ", gender=" + gender + "]"; } /** * 值得注意的是,从文件person.out中获取的Person对象与Person类中的单例对象并不相等。 * 为了能在序列化过程仍能保持单例的特性,可以在Person类中添加一个readResolve()方法, * 在该方法中直接返回Person的单例对象,如下所示: */ private Object readResolve(){ /** * 无论是实现Serializable接口,或是Externalizable接口, * 当从I/O流中读取对象时,readResolve()方法都会被调用到。 * 实际上就是用readResolve()中返回的对象直接替换在反序列化过程中创建的对象, * 而被创建的对象则会被垃圾回收掉。 */ return instanceHolder.instance; } }
public class TestSingletonPerson { public static void main(String[] args) { try { File file=new File("singletonPerson.out"); ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file)); oos.writeObject(SingletonPerson.getInstance());//写出 oos.close(); // ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file)); SingletonPerson singletonPerson=(SingletonPerson) ois.readObject();//读入 ois.close(); // System.out.println("结果1:"+singletonPerson); System.out.println(SingletonPerson.getInstance()==singletonPerson); //false,在SingletonPerson中加入readResolve()方法后即输出true. // } catch (Exception e) { e.printStackTrace(); } } }
发表评论
-
URI - URL处理
2021-10-30 16:38 228import okhttp3.HttpUrl; impo ... -
异步批量执行任务与回滚
2020-10-16 09:19 1153java异步方式(结合@Async和CompletableFu ... -
java 递归 获取树形结构数据
2018-10-24 11:00 2996private static void print2() ... -
Emoji 表情符号 处理
2018-08-21 17:56 1278-Emoji 百科 https://baike.baidu.c ... -
Java基础-01
2018-08-10 14:49 4790、Java 基本数据类型 --8种基本类型 http://w ... -
java基础-02-JavaBean、Final关键字等等
2017-08-31 10:50 424【JavaBean】 参考博客: ---- JavaBean ... -
涉及计算机概念-Windows-Linux
2017-08-15 18:57 4171、域控 --windows域 https://baike.b ... -
IO、集合、多线程等基础框架
2017-07-10 15:04 11721、集合 Java集合总览 http://www.import ... -
Intellij idea使用经验
2017-05-08 18:52 373lombok配置和介绍 @Data @NoArgsConst ... -
form表单
2017-04-11 17:44 3891、postman中 form-data、x-www-form ... -
处理图片
2017-04-11 11:12 4151、import com.sun.image.codec.jp ... -
关心的技术
2017-01-23 09:21 409排名前5的编程语言: JAVA 、C、 C++、 C#、 PY ... -
app接口响应定向跳转页面
2017-01-19 16:40 1164http://127.0.0.1:8888/app/goo ... -
解析客户端请求信息Headers
2016-12-21 16:35 531ANDROID客户端请求 {Accept=[applica ... -
高可用 高并发 java并发相关 ThreadLocal、Volatile
2016-11-23 10:30 432参考博客: --互联网高可用架构技术实践 http://www ... -
引用包里面的工具类-BeanUtils-StringUtils-CollectionUtils等等
2016-11-22 11:47 15041、BeanUtils.copyProperties() Be ... -
Base64处理byte[ ]和base64字符串之间的转换
2016-11-17 09:59 24811、工具类 import org.apache.commo ... -
数据库sql、mybatis、堆栈
2016-04-01 16:00 6601、数据库方面 SQL SERVER: select r.id ... -
java project export 工程jar包单独运行(bat文件)
2016-03-22 10:28 497一、导出JAR并运行 1、右击工程-->Export-- ... -
JDK安装方法参考
2015-11-24 15:52 428【参考方法】 系统变量下: JAVA_HOME C:\ ...
相关推荐
Java 串行化主要通过实现`java.io.Serializable`接口来实现,同时也提供了`java.io.Externalizable`接口来提供更细粒度的控制。 **一、Serializable接口** `Serializable`是Java中的一个标记接口,没有包含任何方法...
在Java中,实现`Serializable`接口的类可以被序列化。然而,有时我们可能希望在序列化过程中忽略某些敏感或临时的成员变量。这就是`transient`关键字的用途。 `transient`关键字用于标记某个成员变量,使其在序列化...
可以通过实现Serializable接口并重写readResolve()方法来解决这个问题。 此外,Singleton模式虽然简单易用,但也有一些缺点,如违背了开闭原则(对扩展开放,对修改关闭),导致程序难以进行单元测试,以及在某些多...
### Java.io.Serializable 序列化...通过实现 `Serializable` 接口或 `Externalizable` 接口,可以轻松地实现序列化和反序列化功能。需要注意的是,在实际应用中还需要考虑序列化的效率、安全性以及版本兼容性等问题。
### Java中的transient关键字详解 在Java编程语言中,`transient`关键字是一个非常重要的概念,主要用于对象序列化过程中对特定变量的控制。当一个类实现了`Serializable`接口时,其对象可以被序列化为一个持久化的...
4. 如果一个类的所有实例变量都是`transient`,那么该类就没有必要实现`Serializable`接口,因为序列化没有任何意义。 **示例代码** 下面是一个简单的例子,展示了如何使用`transient`关键字: ```java import ...
本教程将详细讲解如何通过Serializable接口来实现Intent对象的传递。 首先,了解Serializable接口。在Java中,Serializable是用于序列化和反序列化的接口。当一个类实现了这个接口,它的实例就可以被转化为一串字节...
在Java编程语言中,`Serializable`接口是一个非常重要的概念,它是实现对象持久化的关键。本文将深入探讨`Serializable`接口的细节,以及与其相关的高级知识。 `Serializable`接口是Java中的一个标记接口,没有包含...
例如,`MySerializable.java`和`Product.java`两个文件可能分别代表实现了`Serializable`接口的类。`MySerializable`可能是自定义的一个示例类,而`Product`可能是表示产品的类,它们都包含了可序列化的属性。 在`...
在Java编程中,`Serializable`接口是用于对象序列化的重要工具。对象序列化是指将一个对象的状态转换为字节流的过程,以便存储或通过网络进行传输。另一方面,`Stream`通常指的是I/O流,它是Java处理输入/输出数据的...
另外,对于包含敏感信息的类,可以通过使用`transient`关键字标记那些不想序列化的字段,因为`transient`字段不会被序列化。 此外,`Serializable`接口没有版本控制机制,当序列化的类结构发生变化(比如增加、删除...
### C#中Serializable的作用与对象序列化详解 #### 一、引言 在现代软件开发中,特别是基于.NET框架的应用程序开发中,对象序列化是一项非常重要的技术。它允许将对象的状态转换为一种持久的形式(如文件或网络传输...
1. **不参与序列化**:当一个类实现了`java.io.Serializable`接口,它的实例可以被序列化。但是,如果类中的某个字段被声明为`transient`,那么这个字段就不会被序列化器处理。即使在序列化和反序列化过程中,这个...
2. **序列化**:如果Singleton实现了Serializable接口,需处理反序列化时的实例化问题,否则可能会创建多个实例。 3. **测试**:测试Singleton类时,需考虑静态初始化可能导致的问题,可能需要特殊的测试策略。 4. *...
当你创建一个可序列化的类(通过实现`Serializable`接口)时,如果你不想某些字段在序列化过程中被保存或在反序列化后恢复,就可以使用`transient`修饰这些字段。 **什么是序列化?** 序列化是将对象的状态转换为...
java->serializable深入了解 java->serializable深入了解 java->serializable深入了解
本篇将详细介绍如何通过`Bundle` 传递基本数据类型、Parcelable类型数据以及Serializable类型数据。 ### 一、基本数据类型的传递 在Android中,基本数据类型包括int、boolean、float、double、char等。通过`put()`...
- 如果一个类的所有实例字段都是`transient`的,那么这个类就没有必要实现`Serializable`接口,因为序列化将没有任何意义。 - 在处理`transient`变量时,开发者通常需要自己管理这些变量的状态,例如在反序列化后...
本文将深入探讨两种主要的序列化方式:Serializable和Parcelable,并比较它们的优缺点以及适用场景。 首先,我们来了解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Android中,这个...