- 浏览: 1332667 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
被Serializable接口声明的类的对象的内容都将被序列化,如果现在用户希望自己指定序列化的内容,则可以让一个类实现Externalizable接口,此接口定义如下:
- public interface Externalizable extends Serializable {
- public void writeExternal(ObjectOutput out) throws IOException ;
- public void readExternal(ObjectInput in) throws IOException,
- ClassNot FoundException ;
- }
Externalizable接口是Serializable接口的子接口,在此接口中定义了两个方法,这两个方法的作用如下。
writeExternal(ObjectOutput out):在此方法中指定要保存的属性信息,对象序列化时调用。
readExternal(ObjectInput in):在此方法中读取被保存的信息,对象反序列化时调用。
这两个方法的参数类型是ObjectOutput和ObjectInput,两个接口的定义如下。
ObjectOutput接口定义:
- public interface ObjectOutput extends DataOutput
ObjectInput接口定义:
- public interface ObjectInput extends DataInput
可以发现以上两个接口分别继承DataOutput和DataInput,这样在这两个方法中就可以像DataOutputStream和DataInputStream那样直接输出和读取各种类型的数据。
如果一个类要使用Externalizable实现序列化时,在此类中必须存在一个无参构造方法,因为在反序列化时会默认调用无参构造实例化对象,如果没有此无参构造,则运行时将会出现异常,这一点的实现机制与Serializable接口是不同的。
范例:修改Person类并实现Externalizable接口
- package org.lxh.demo12.serdemo;
- import java.io.Externalizable;
- import java.io.IOException;
- import java.io.ObjectInput;
- import java.io.ObjectOutput;
- public class Person implements Externalizable {// 此类的对象可以被序列化
- private String name; // 声明name属性
- private int age; // 声明age属性
- public Person(){} // 必须定义无参构造
- public Person(String name, int age) { // 通过构造方法设置属性内容
- this.name = name;
- this.age = age;
- }
- public String toString() { // 覆写toString()方法
- return "姓名:" + this.name + ";年龄:" + this.age;
- }
- // 覆写此方法,根据需要读取内容,反序列化时使用
- public void readExternal(ObjectInput in) throws IOException,
- ClassNotFoundException {
- this.name = (String)in.readObject() ; // 读取姓名属性
- this.age = in.readInt() ; // 读取年龄
- }
- // 覆写此方法,根据需要可以保存属性或具体内容, 序列化时使用
- public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(this.name) ; // 保存姓名属性
- out.writeInt(this.age) ; // 保存年龄属性
- }
- }
以上程序中的Person类实现了Externalizable接口,这样用户就可以在类中有选择地保存需要的属性或者其他的具体数据。在本程序中,为了与之前的程序统一,将全部属性保存下来。
范例:序列化和反序列化Person对象
- package org.lxh.demo12.serdemo;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.OutputStream;
- public class SerDemo03 {
- public static void main(String[] args) throws Exception {
- ser(); // 序列化
- dser(); // 反序列化
- }
- public static void ser() throws Exception { // 序列化操作
- File f = new File("D:" + File.separator + "test.txt");
- ObjectOutputStream oos = null;
- OutputStream out = new FileOutputStream(f); // 文件输出流
- oos = new ObjectOutputStream(out); // 为对象输出流实例化
- oos.writeObject(new Person("张三", 30)); // 保存对象到文件
- oos.close(); // 关闭输出
- }
- public static void dser() throws Exception { // 反序列化操作
- File f = new File("D:" + File.separator + "test.txt");
- ObjectInputStream ois = null;
- InputStream input = new FileInputStream(f); // 文件输出流
- ois = new ObjectInputStream(input); // 为对象输出流实例化
- Object obj = ois.readObject(); // 读取对象
- ois.close(); // 关闭输出
- System.out.println(obj);
- }
- }
从以上代码中可以发现,使用Externalizable接口实现序列化明显要比使用Serializable接口实现序列化麻烦得多,除此之外,两者的实现还有不同,如表12-27所示。
表12-27 Externalizable接口与Serializable接口实现序列化的区别
序 号 |
区 别 |
Serializable |
Externalizable |
1 |
实现复杂度 |
实现简单,Java对其 有内建支持 |
实现复杂, 由开发人员自己完成 |
2 |
执行效率 |
所有对象由Java统一保存, 性能较低 |
开发人员决定哪个对象保存, 可能造成速度提升 |
3 |
保存信息 |
保存时占用空间大 |
部分存储, 可能造成空间减少 |
在一般的开发中,因为Serializable接口的使用较为方便,所以出现较多。
发表评论
-
J2ME 的优化措施
2012-07-11 02:15 1169常见的性能瓶颈:1.文件的读写和网络的操作2.CPU3.内存4 ... -
JAVA缓存 - Cache类
2011-09-28 11:04 4606JAVA缓存有两种: 一、文件缓存,是指把数据存储在磁盘上 ... -
Java注释(Annotation)详解
2011-03-31 18:22 2397注释:在一个类中可以有多个,类似于一个类可以有多个实例; ... -
Java去除字符串中的空格、回车、换行符、制表符
2011-02-15 11:06 3553本方法采用的是java的正则表达式 import jav ... -
线程池编程
2011-01-23 21:02 1101线程池编程 -
设计模式:Java语言中的应用
2011-01-23 20:59 1315设计模式:Java语言中的应用 -
java用了中间缓存变量
2011-01-23 18:37 2387Java语法、语言特性与机制 2011-01-22 19:1 ... -
Java集合总结
2011-01-19 11:16 3817Set:不区分元素的顺序,不允许出现重复的值list:区分元素 ... -
java.util.current的主要方法简介
2011-01-08 22:18 3433JDK5中增加了Doug Lea的并发库,这一引进给java线 ... -
线程池
2011-01-08 21:03 2066对每个客户都分配一个新的工作线程。当工作线程与客户通信结束,这 ... -
SimpleDateFormat
2010-12-10 16:11 1360With SimpleDateFo ... -
使用 XStream 在 JavaBean 与 XML/JSON 之间相互转换
2010-12-10 14:24 1553XML 和 JSON 是当今常用的两种数据描述与传输的格式,特 ... -
Linux上JDK的 安装和卸载 详细 (转)
2010-11-27 15:48 1922安装 1. 去http://java.sun.com ... -
java 路径问题
2010-11-26 16:21 12941.JSP/Servlet中获得当前应用的相对路径和绝对路径 ... -
对synchronized(this)的一些理解
2010-11-25 23:41 1021一、当两个并发线程访问同一个对象object中的这个synch ... -
Java实现文件拷贝的4种方法(转)
2010-11-15 12:33 1246... -
Java内省和反射机制三步曲之 - 内省
2010-11-11 12:15 1341经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java ... -
java内省机制
2010-11-11 11:10 2393反射 (Reflection):反射就是让你可以通 ... -
Design Pattern: Thread-Specific Storage 模式
2010-11-11 00:00 1207无论如何,要编写一个多执行绪安全(thread-safe)的程 ... -
Design Pattern: Two-phase Termination 模式
2010-11-10 23:59 1047Two-phase Termination直译的话是“两相终止 ...
相关推荐
Java 串行化主要通过实现`java.io.Serializable`接口来实现,同时也提供了`java.io.Externalizable`接口来提供更细粒度的控制。 **一、Serializable接口** `Serializable`是Java中的一个标记接口,没有包含任何方法...
另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何代码支持 3 性能略差 实现Externalizable接口 1 程序员决定存储...
Serializable有一个子接口Externalizable,实现Externalizable接口的类可以自行控制对象序列化荷反序列化过程。 一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果...
其中,Serializable 接口是 Java 语言提供的默认序列化方式,而 Externalizable 接口则允许开发者自定义序列化行为。 对象流的应用场景很多,如在网络游戏中,需要传输游戏状态、游戏对象等复杂数据;在分布式系统...
- **`Externalizable`接口**:这是`Serializable`接口的一个子接口,它要求实现类提供两个方法`readExternal`和`writeExternal`来自定义序列化和反序列化的过程。 #### 二、序列化的具体实现方式 在Java中,对象...
- **实现`Externalizable`接口**:如果`Customer`类实现了`Externalizable`接口,那么必须实现`readExternal`和`writeExternal`方法。此时,序列化过程将通过调用`writeExternal`方法进行,而反序列化时,则先通过无...
Java 提供了两种方式来实现序列化:一种是使用 Serializable 接口,另一种是使用 Externalizable 接口。 在上面的代码中,我们可以看到, ByteToObject 方法将 byte 数组转化为对象,而 ObjectToByte 方法将对象...
使用 `Externalizable` 接口的主要优点在于可以更精确地控制序列化和反序列化过程,这对于需要自定义序列化逻辑的对象非常有用。 #### 六、序列化中的注意事项 - **`transient` 关键字**:使用 `transient` 可以...
另外,还有`java.io.Externalizable`接口,它继承自`Serializable`,但提供了更细粒度的控制权,允许类自定义序列化和反序列化的行为。如果一个类实现了`Externalizable`,则需要手动实现`writeExternal...
1)Serializable和Externalizable接口Xstream框架2)Simple框架 3)Apache的AXIOM框架 2、XML验证文档的生成工具 trang.jar 3、利用XSD文件的XML3种验证方法 1)Dom4j的SAXValidator (dom4j.jar, javax.xml....
另外,Java还提供了一个更灵活的序列化接口`Externalizable`,它要求类自己控制序列化和反序列化的过程,需要实现`writeExternal()`和`readExternal()`方法。这种方式更耗费资源,但能更好地控制序列化过程,特别是...
要实现对象序列化,Java类必须实现`Serializable`接口或`Externalizable`接口。`Serializable`接口是一个空接口,当一个类实现它时,表明该类的所有实例都可以被序列化。而`Externalizable`接口提供了更多的控制权,...
2. **实现Externalizable接口**:如果需要更多控制权,可以选择实现`Externalizable`接口,该接口要求实现`writeExternal()`和`readExternal()`方法,从而可以自定义序列化和反序列化的逻辑。 #### 示例代码:序列...
实现Externalizable接口的类需要提供两个方法:writeExternal()和readExternal(),用于提供对序列化过程的控制,这比使用Serializable接口时提供的默认序列化行为更加灵活。 知识点二:RMI(Remote Method ...
这类命令可以使用 Externalizable 接口或特定于应用程序的方法来获取数据。 英文文档: JavaBeans components that are Activation Framework aware implement this interface to find out which command verb ...
3. 实现`Externalizable`接口则更为灵活,需要手动实现`writeExternal(ObjectOutput out)`和`readExternal(ObjectInput in)`方法,这允许开发者完全控制对象的序列化和反序列化过程。 序列化和反序列化对于数据的...