- 浏览: 164548 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (81)
- UI (6)
- 后台 (22)
- 数据库 (3)
- 其他 (3)
- 问题集 (5)
- android (0)
- 随笔 (2)
- lucene (0)
- htmlParser (1)
- python (14)
- mongodb (1)
- HTTP (1)
- eclipse (1)
- EXTJS (2)
- Spring (1)
- maven (4)
- WEB JS (2)
- java tree (1)
- javascript ActionScript (1)
- 工具 (2)
- httpclient (1)
- tomcat gzip (1)
- 线程 (1)
- 数据库 MYSQL (1)
- 后台 缓存 (1)
- linux (3)
- SQL (1)
- hadoop (1)
最新评论
-
asqin:
getFileIO 时 in 对象为null
java修改,读取properties文件 -
holleyangyanges:
你试过你的代码吗?
HttpClient CAS -
a455642158:
tks……
java修改,读取properties文件 -
faikr:
请问,这个子表的数据,你是怎么和主表相关字段做对应的?比如,我 ...
jquery之jquerygrid-subgrid -
jrius:
这种方式 应该是抓不到的,百度指数使用了amf格式
JAVA抓取百度指数数据
被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接口的使用较为方便,所以出现较多
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接口的使用较为方便,所以出现较多
发表评论
-
iptables
2012-11-08 09:24 8811、安装iptables防火墙 Cen ... -
Hadoop 查找最大数
2012-08-15 11:11 2420package com.lch.find; import ... -
cxf Dynamic webservice
2012-06-06 11:18 1591/** * @Title: DynamicClient ... -
枚举单例
2012-06-02 22:23 907package myproject.javatest; ... -
Java 自定义错误类【转】
2012-03-29 11:37 820原文地址 :[url] http://www.cnblogs. ... -
eclipse: Access restriction Error
2012-02-22 15:32 896在搭建项目环境时出现了以下编译错误: Access res ... -
eclipse 不自动编译java文件的问题
2012-02-21 11:14 1653「Project」菜单 「项目」菜单可以对工作台中的项目执行动 ... -
Filter指定浏览器来缓存或不缓存服务器数据
2012-02-17 15:08 1703import java.io.*; import ... -
JAVA 单例的两种模式
2012-02-16 09:52 1396/** * 单例模式:保证一个java的类只有一个实例 ... -
httpclient4 小例子
2012-02-01 16:29 1402import java.io.BufferedReader ... -
java修改,读取properties文件
2011-11-22 16:04 11734package com.ideamov.platform.ut ... -
【转】JSONLIB
2011-11-17 12:44 772Json-lib可以将Java对象转成json格式的字符串,也 ... -
转 HttpClient 基础
2011-01-14 11:57 632原文地址:http://blog.csdn ... -
java 综合
2011-01-12 15:34 745JAVA 打包 CMD下进入WEB目录下 jar cvf ca ... -
JBOSS HTTPS 续
2011-01-12 15:01 1473原文地址:http://docs.jboss.org/jbos ... -
JBOSS HTTPS
2011-01-12 15:00 1295<Server> <!--APR ... -
HttpClient CAS
2011-01-11 10:09 2578package com.lch.sso; import ... -
spring security2.x 统一权限管理 数据库读取权限
2010-11-30 14:41 1393最近在研究统一权限管理,在网上深找了这一块资料,虽然JAVA开 ... -
java执行CMD命令
2010-11-12 15:22 1381package com.lch.swf; impor ... -
JAVA抓取百度指数数据
2010-11-09 09:41 6473在论坛看帖子看到一则 ...
相关推荐
主要介绍了JAVA序列化Serializable及Externalizable区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
NULL 博文链接:https://zhycaf.iteye.com/blog/982092
另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何代码支持 3 性能略差 实现Externalizable接口 1 程序员决定存储...
Serializable有一个子接口Externalizable,实现Externalizable接口的类可以自行控制对象序列化荷反序列化过程。 一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果...
1)Serializable和Externalizable接口Xstream框架2)Simple框架 3)Apache的AXIOM框架 2、XML验证文档的生成工具 trang.jar 3、利用XSD文件的XML3种验证方法 1)Dom4j的SAXValidator (dom4j.jar, javax.xml....
这类命令可以使用 Externalizable 接口或特定于应用程序的方法来获取数据。 英文文档: JavaBeans components that are Activation Framework aware implement this interface to find out which command verb ...
You can encode keyed and non-keyed, where the latter means you're encoding an externalizable class. While deserializing, if no class with the classname of the received object is found, CocoaAMF ...
dom4J的使用方法ppt.
Externalizable Externalizable 实例类的唯一特性是可以被写入序列化流中,该类负责保存和恢复实例内容。 FileFilter 用于抽象路径名的过滤器。 FilenameFilter 实现此接口的类实例可用于过滤器文件名。 ...
其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ObjectOutputStream ObjectInputStream Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第7页。...
Serializable接口和Externalizable接口实现序列化和反序列化
Groovy-io 往返于JSON格式的完美序列化(可在)。 要包含在您的项目中: ... <artifactId>groovy-io <version>1.1.3 groovy-io由两个主要类组成,一个... groovy-io不需要类实现Serializable或Externalizable来进
虽然 LargeCollections 支持任何 Serializable/Externalizable/Writable/Kryo-Serializable Key 和 Value 类,但底层实现将所有内容存储为字节数组键值存储(类似于 HBase)。 因此,每个键/值实例都需要转换为
最近阅读Serializable接口和Externalizable接口的源码,并结合了一些资料,对面试过程中与序列化相关的内容做了一些总结。 一、序列化、反序列化、使用场景、意义。 序列化:将对象写入IO流中; 反序列化:从IO流中...
支持Serializable和Externalizable接口的自动实现。 极其可定制的代码输出。 您可以更改生成的类的每个方面,甚至可以使用基于的自定义模板添加您自己的代码。 对不可变值对象的强大支持,包括最终字段和不可变...