1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存
object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
2、什么情况下需要序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
3、当对一个对象实现序列化时,究竟发生了什么?
在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:
Student student = new Student();
student.setId(1);
student.setName("Harrison");
student.setSex("boy");
当通过下面的代码序列化之后,
Student对象中的
id,
name和
sex实例变量的值都被保存到
data.ser文件中,这样以后又可以把它从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对象。
// Make a FileOutputStream
FileOutputStream fos = new FileOutputStream("data.ser");
// Make a ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(fos);
// Write the object
oos.writeObject(student);
// Close the ObjectOutputStream
oos.close();
// Close the FileOutputStream
fos.close();
4、相关注意事项
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有
private,
public等field,对于一个要传输的对象,比如写到文件,或者进行
rmi传输 等等,在序列化进行传输的过程中,这个对象的
private等域是不受保护的。
2.资源分配方面的原因,比如
socket,
thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。
5、测试代码
/*
* @(#)StudentTest.java 1.0 Jun 4, 2010
*/
package org.asheng.model;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
/**
* @author Harrison Wang
* @version 1.0
*/
public class StudentTest {
private ObjectOutputStream oos;
private FileOutputStream fos;
private ObjectInputStream ois;
private FileInputStream fis;
/**
* Write the object instance
* @param student
* @return
*/
public boolean writeInstance(Student instance) {
try {
// Make a FileOutputStream
fos = new FileOutputStream("data.ser");
// Make a ObjectOutputStream
oos = new ObjectOutputStream(fos);
// Write the object
oos.writeObject(instance);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// Close the ObjectOutputStream
oos.close();
// Close the FileOutputStream
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
/**
* Read the object instance
* @return
*/
public Student readInstance() {
Student stu = null;
try {
// Make a FileInputStream
fis = new FileInputStream("data.ser");
// Make a ObjectInputStream
ois = new ObjectInputStream(fis);
// Get the Object
stu = (Student) ois.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
// Close the ObjectInputStream
ois.close();
// Close the FileInputStream
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return stu;
}
@Test
public void test() {
Student student = new Student();
student.setId(1);
student.setName("Harrison");
student.setSex("boy");
boolean isWriteen = writeInstance(student);
if (isWriteen == true) {
// Get the student instance
Student stu = readInstance();
// Print the student name
System.out.println(stu.getName());
}
}
}
/*
* @(#)Student.java 1.0 Jun 4, 2010
*/
package org.asheng.model;
import java.io.Serializable;
/**
* @author Harrison Wang
* @version 1.0
*/
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
分享到:
相关推荐
总结,Java的序列化与反序列化是强大的工具,能够帮助我们处理对象的持久化和网络传输。理解并熟练掌握这一技术,对提升Java开发能力具有重要意义。在实际应用中,要根据具体需求来选择合适的序列化库,如Google的...
### Java Serializable(序列化)的理解和总结 #### 一、序列化的定义与目的 序列化是一种将对象的状态转换为可以存储或传输的形式的过程。在Java中,如果一个类实现了`Serializable`接口,那么该类的对象就可以被...
序列化的核心在于能够将对象的状态转换为可以存储或传输的形式,从而实现对象的持久化和远程通信等功能。 #### 二、序列化的应用场景 序列化在多种场景下都非常有用: 1. **对象持久化**:当你希望将内存中的对象...
序列化和反序列化是Java中非常重要的概念,它们提供了强大的工具来处理对象的状态保存和恢复问题。通过上述介绍和示例代码,我们可以看到序列化的基本过程及其应用场景。掌握这些知识对于开发高效可靠的Java应用程序...
### Java.io.Serializable 序列化...通过实现 `Serializable` 接口或 `Externalizable` 接口,可以轻松地实现序列化和反序列化功能。需要注意的是,在实际应用中还需要考虑序列化的效率、安全性以及版本兼容性等问题。
在 Java 中,序列化和反序列化是通过实现 Serializable 接口来实现的。Serializable 接口是一个标记接口,不包含任何方法,但它告诉 Java虚拟机(JVM)该类可以被序列化。 在上面的代码中,我们可以看到 ...
而在Java中,我们可以通过实现`Serializable`接口来使类支持序列化,或者使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行对象的序列化和反序列化。 接下来,我们讨论反序列化。反序列化是序列...
Java反序列化是一种将已...总之,Java反序列化利用是一个复杂的安全问题,需要开发者对序列化和反序列化过程有深入的理解,以及对潜在的安全风险保持警惕。通过了解这些知识点,可以更好地保护应用程序免受此类攻击。
Java对象的序列化和反序列化是Java编程中一项...总结,Java对象的序列化和反序列化是Java编程中的基础概念,它涉及到数据持久化、网络通信等多个方面。理解并熟练运用这一技术,能够帮助开发者更有效地管理和传递数据。
1. `java.io.ObjectOutputStream`和`java.io.ObjectInputStream`:基础的序列化和反序列化工具类。 2. `java.io.Serializable`: 标记接口,表明对象支持序列化。 3. `java.io.NotSerializableException`: 当尝试序列...
综上,Java对象序列化和反序列化是Java开发中的基础技能,它们在数据持久化、网络通信等方面发挥着关键作用。了解并掌握这些知识,能够帮助开发者更好地设计和实现各种功能。在实际应用中,需要注意安全性和版本兼容...
2. **性能**:序列化和反序列化可能需要大量的CPU和内存资源,尤其是处理大型或复杂对象时。 3. **数据格式**:Java序列化生成的字节流是平台和版本相关的,不适用于跨平台或跨语言通信。 4. **替代方案**:Java...
- 通过实现`writeObject()`和`readObject()`方法,可以自定义序列化和反序列化的行为,例如处理复杂的对象结构或敏感数据。 8. **序列化安全**: - 序列化可能引发安全问题,如序列化漏洞。因此,应当谨慎处理反...
在Java编程语言中,`Serializable`接口是一个非常重要的概念,它涉及到对象的状态持久化和网络传输。序列化是将一个对象转换为字节流的过程,这样就可以将其保存到磁盘、数据库或者在网络中进行传输。了解序列化的...
当一个类实现Serializable接口后,Java运行时系统会自动调用`writeObject()`和`readObject()`方法来完成序列化和反序列化。默认情况下,这些方法会递归地序列化类的所有字段,包括私有和静态字段。但也可以自定义...
这样可以确保即使对象的结构发生了变化,仍然能够正确地进行序列化和反序列化。 **5.2 目标** 版本管理的目标是在对象结构发生变更时保持序列化的兼容性。这有助于减少因对象变更而导致的问题。 **5.3 假设** ...
- Java允许使用 `writeObject()` 和 `readObject()` 方法来自定义序列化和反序列化的行为,这两个方法需要在类中声明为`private`,并由`java.io.Serializable` 接口的实现类提供。 7. **序列化安全性** - 序列化...
Java对象序列化是一种将对象转换为字节流的过程,以便可以将其存储在磁盘上,或者在网络中进行传输。这是Java平台提供的一种...理解和熟练运用这些概念对于Java开发者来说非常重要,特别是在处理持久化和分布式系统时。
Java序列化和反序列化是将对象的状态转换为字节流和从字节流恢复对象状态的过程,这对于数据持久化、网络传输以及跨进程通信等场景至关重要。在Java中,`java.io.Serializable`接口用于标记一个类是可序列化的。然而...