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
相关推荐
* 使用 Externalizable 接口实现序列化和反序列化 * 使用 Java 序列化 API 实现序列化和反序列化 在实际开发中,选择合适的序列化和反序列化方法取决于具体的需求和场景。在本例中,我们使用 Serializable 接口实现...
Java 串行化是Java平台中的一个重要特性,它允许...综上所述,Java的序列化和外部化是实现对象持久化和跨进程通信的关键技术。理解并熟练掌握这些概念,能够帮助开发者更好地处理与对象状态保存和恢复相关的各种问题。
这样可以确保即使对象的结构发生了变化,仍然能够正确地进行序列化和反序列化。 **5.2 目标** 版本管理的目标是在对象结构发生变更时保持序列化的兼容性。这有助于减少因对象变更而导致的问题。 **5.3 假设** ...
而`Externalizable`接口提供了更多的控制权,允许开发者自定义序列化和反序列化的过程。 实现`Serializable`接口的示例如下: ```java public class Person implements Serializable { private String name; ...
Java序列化和反序列化是Java平台中的核心特性,允许对象在各种上下文中持久化和传输。虽然它提供了许多便利,但同时也需要注意安全性问题和性能优化。在实际开发中,根据需求选择合适的序列化策略和工具是至关重要的...
在这种情况下,可以考虑使用`writeObject()`和`readObject()`方法来自定义序列化行为,或者使用`Externalizable`接口,它比`Serializable`提供了更多的控制。 6. **序列化框架**:除了Java内置的序列化机制,还有...
2. **实现Externalizable接口**:如果需要更多控制权,可以选择实现`Externalizable`接口,该接口要求实现`writeExternal()`和`readExternal()`方法,从而可以自定义序列化和反序列化的逻辑。 #### 示例代码:序列...
Java的序列化和反序列化是Java开发中重要的概念,主要涉及对象状态的持久化以及在网络传输中的数据转换。在Java中,序列化是将一个对象转换为字节序列的过程,而反序列化则是将字节序列恢复为原始对象的过程。 1. *...
- 通过实现`writeObject()`和`readObject()`方法,可以自定义序列化和反序列化的行为,例如处理复杂的对象结构或敏感数据。 8. **序列化安全**: - 序列化可能引发安全问题,如序列化漏洞。因此,应当谨慎处理反...
`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`是Java标准库中用于序列化和反序列化的类。前者通过`writeObject()`方法将对象写入输出流,后者通过`readObject()`方法从输入流中读取对象。 需要注意的...
**实现Externalizable接口**:这种方式比隐式序列化更灵活,因为它需要我们手动实现`writeExternal()`和`readExternal()`方法来控制哪些数据需要序列化和反序列化。这样,我们可以精细地控制序列化的过程,比如选择...
另外,Java还提供了一个更灵活的序列化接口`Externalizable`,它要求类自己控制序列化和反序列化的过程,需要实现`writeExternal()`和`readExternal()`方法。这种方式更耗费资源,但能更好地控制序列化过程,特别是...
另外,还有`java.io.Externalizable`接口,它继承自`Serializable`,但提供了更细粒度的控制权,允许类自定义序列化和反序列化的行为。如果一个类实现了`Externalizable`,则需要手动实现`writeExternal...
- `Externalizable`接口提供了一种自定义序列化和反序列化方式,但需要手动编写序列化逻辑。 8. **`ObjectInputStream`和`ObjectOutputStream`的其他方法:** - `defaultWriteObject()`用于写入默认的流式序列化...
实现`Externalizable`接口的类可以完全控制序列化和反序列化的过程,而不是依赖于默认的序列化机制。通过重写`writeExternal`和`readExternal`方法,程序员可以自定义对象状态的存储和恢复方式,这通常用于优化性能...
Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...
- 实现`Serializable`接口,并可选择重写`writeObject()`和`readObject()`方法来自定义序列化和反序列化逻辑。 5. **处理循环引用**: - 使用`transient`关键字标记循环引用的成员变量,或者通过重写序列化方法来...
3. **意义**:如果两个类的`serialVersionUID`相同,则认为这两个类是同一版本,可以互相序列化和反序列化。 #### 序列化过程详解 1. **序列化**:通过`java.io.ObjectOutputStream`类的`writeObject()`方法将对象...