- 浏览: 168064 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 9301、安装iptables防火墙 Cen ... -
Hadoop 查找最大数
2012-08-15 11:11 2454package com.lch.find; import ... -
cxf Dynamic webservice
2012-06-06 11:18 1634/** * @Title: DynamicClient ... -
枚举单例
2012-06-02 22:23 948package myproject.javatest; ... -
Java 自定义错误类【转】
2012-03-29 11:37 854原文地址 :[url] http://www.cnblogs. ... -
eclipse: Access restriction Error
2012-02-22 15:32 929在搭建项目环境时出现了以下编译错误: Access res ... -
eclipse 不自动编译java文件的问题
2012-02-21 11:14 1700「Project」菜单 「项目」菜单可以对工作台中的项目执行动 ... -
Filter指定浏览器来缓存或不缓存服务器数据
2012-02-17 15:08 1747import java.io.*; import ... -
JAVA 单例的两种模式
2012-02-16 09:52 1445/** * 单例模式:保证一个java的类只有一个实例 ... -
httpclient4 小例子
2012-02-01 16:29 1447import java.io.BufferedReader ... -
java修改,读取properties文件
2011-11-22 16:04 11802package com.ideamov.platform.ut ... -
【转】JSONLIB
2011-11-17 12:44 815Json-lib可以将Java对象转成json格式的字符串,也 ... -
转 HttpClient 基础
2011-01-14 11:57 670原文地址:http://blog.csdn ... -
java 综合
2011-01-12 15:34 784JAVA 打包 CMD下进入WEB目录下 jar cvf ca ... -
JBOSS HTTPS 续
2011-01-12 15:01 1515原文地址:http://docs.jboss.org/jbos ... -
JBOSS HTTPS
2011-01-12 15:00 1335<Server> <!--APR ... -
HttpClient CAS
2011-01-11 10:09 2635package com.lch.sso; import ... -
spring security2.x 统一权限管理 数据库读取权限
2010-11-30 14:41 1427最近在研究统一权限管理,在网上深找了这一块资料,虽然JAVA开 ... -
java执行CMD命令
2010-11-12 15:22 1425package com.lch.swf; impor ... -
JAVA抓取百度指数数据
2010-11-09 09:41 6530在论坛看帖子看到一则 ...
相关推荐
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)`方法,这允许开发者完全控制对象的序列化和反序列化过程。 序列化和反序列化对于数据的...