1.Java对象序列化是将 对象的实例域数据( 包括private私有域) 进行持久化存储。而并非是将整个对象所属的类信息进行存储。
2.我们都知道凡要序列化的类都必须实现Serializable接口。包括Externalizable接口
3.包含了不可序列化的对象域的对象也是不能序列化的。
实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式
对象序列化包括如下步骤:
1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
2) 通过对象输出流的writeObject()方法写对象。
对象反序列化的步骤如下:
1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
2) 通过对象输入流的readObject()方法读取对象。
相比Serializable接口,Externalizable接口更加能够控制序列化过程中的细节。
而本人实际测试中,Externalizable接口进行序列化,会比Serializable接口,速度要快20%-40%
写一个Externalize序列化的Example:
import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; public class Customer implements Externalizable { private String name; private int age; public Customer(){ //必须创建一个无参的构造函数,因为Externalizable在创建对象的时候,会调用构造函数。 //否则会报错java.io.InvalidClassException no valid constructor } public Customer(String name, int age) { this.name = name; this.age = age; } public String toString() { return "name=" + name + ", age=" + age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { String name = in.readUTF(); int age = in.readInt(); this.setName(name); this.setAge(age); } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeUTF(this.name); out.writeInt(this.age); } }
调用端测试:
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class ObjectSerializeTest { public void saveCustomer() throws FileNotFoundException, IOException { File file = new File("D:/objectFile.obj"); if(file.exists()) file.delete(); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream( "D:/objectFile.obj")); // 序列化对象 Customer2 c = new Customer2("阿蜜果", 24); out.writeObject(c); out.close(); } public Customer2 getCustomer() throws FileNotFoundException, IOException, ClassNotFoundException { // 反序列化对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream( "D:/objectFile.obj")); Customer2 customer = (Customer2) in.readObject(); in.close(); return customer; } public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { int counter = 10000; ObjectSerializeTest test = new ObjectSerializeTest(); test.saveCustomer(); long startTime=System.currentTimeMillis(); //获取开始时间 for(int i=0;i<counter;i++) test.getCustomer(); long endTime=System.currentTimeMillis(); //获取结束时间 System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); } }
refer to:http://hxraid.iteye.com/blog/461935
相关推荐
主要介绍了JAVA序列化Serializable及Externalizable区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
比较常见的做法有两种: 一是把对象包装成JSON字符串传输, 二是采用Java对象的序列化和反序列化。 随着Google工具protoBuf的开源,protobuf也是个不错的选择。 *提示:对JSON,Object Serialize,ProtoBuf 做个对比。...
Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...
NULL 博文链接:https://zhycaf.iteye.com/blog/982092
最近阅读Serializable接口和Externalizable接口的源码,并结合了一些资料,对面试过程中与序列化相关的内容做了一些总结。 一、序列化、反序列化、使用场景、意义。 序列化:将对象写入IO流中; 反序列化:从IO流中...
Serializable接口和Externalizable接口实现序列化和反序列化
Serializable有一个子接口Externalizable,实现Externalizable接口的类可以自行控制对象序列化荷反序列化过程。 一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果...
1、xml序列化的Java3种实现方法 1)Serializable和Externalizable接口Xstream框架2)Simple框架 3)Apache的AXIOM框架 2、XML验证文档的生成工具 trang.jar 3、利用XSD文件的XML3种验证方法 1)Dom4j的SAXValidator ...
Externalizable Externalizable 实例类的唯一特性是可以被写入序列化流中,该类负责保存和恢复实例内容。 FileFilter 用于抽象路径名的过滤器。 FilenameFilter 实现此接口的类实例可用于过滤器文件名。 ...
往返于JSON格式的完美序列化(可在)。 要包含在您的项目中: <groupId>com.cedarsoftware</groupId> <artifactId>groovy-io <version>1.1.3 groovy-io由两个主要类组成,一个读者( GroovyJsonReader )和...
支持Serializable和Externalizable接口的自动实现。 极其可定制的代码输出。 您可以更改生成的类的每个方面,甚至可以使用基于的自定义模板添加您自己的代码。 对不可变值对象的强大支持,包括最终字段和不可变...
dom4J的使用方法ppt.
虽然 LargeCollections 支持任何 Serializable/Externalizable/Writable/Kryo-Serializable Key 和 Value 类,但底层实现将所有内容存储为字节数组键值存储(类似于 HBase)。 因此,每个键/值实例都需要转换为
用请求处理的动词和描述将要操作的数据的 DataHandler 来初始化 Command。注:调用者为 DataHandler 传递 null 值是可以接受的。 verb 此对象引用的 Command Verb。 dh DataHandler。 英文文档: ...
AMF是Action Message Format协议的简称,AMF协议是Adobe公司自己的协议,主要用于数据交互和远程过程调用,在功能上相当于WebService,但是AMF与WebService中的XML不同的是AMF是二进制数据,而XML是文本数据,AMF的...