Java对象序列化原理以及Serializable接口
来源:互联网 发布:中万网络销售 编辑:程序博客网 时间:2024/04/30 00:58
Java对象的序列化就是把一个对象变成二进制的数据流的一中方法,通过对象的序列化可以方便的实现对象的传输和存储。
原理是:对象------------->转换----------------->将对象转变为二进制的数据
在对象序列化时,只有其属性被序列化(每个对象都具备相同的方法,但是每个对象的属性不一定相同,也就是说对象保存的只有其属性信息)
那么一个类的对象要被序列化,这该类就必须实现java.io.Serializable接口,其源码如下:
public interface Serializable {}
可以发现此接口没有定义任何的方法,此接口只是一个标识接口,表示一个类具备了别序列化的能力。
如果要完成对象的输入或输出,必须依赖对象的输入流(ObjectInputStream)和 对象输出流(ObjectOutputStream)。
1、使用对象输出流输出序列化对象的过程称之为序列化。
2、使用对象输入流读入对象的过程称之为反序列话。
程序-------------->ObjectOutputStream------------------->序列化对象<----------------------ObjectInputStream-----------------------------程序
序列化 反序列化
一、ObjectOutputStream对象输出流
他是OutputStream字节数出流的子类,主要有如下方法:
1、 public ObjectOutputStream(OutputStream out) throw IOException 构造方法 如传入输出流对象
2、 public final void writeObject(Object obj) throw IOException 输出对象
其实现如下:
定义一个序列化类。
package andy.serializable.test;import java.io.Serializable;/** * @author Zhang,Tianyou version:2014-11-20 下午2:41:12 * * */public class Student implements Serializable {/** * */private static final long serialVersionUID = 6095384564471868081L;// 实现serializable是指成为序列化类private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
将对象输出到文件d:tes.txt 文件中:
package andy.serializable.test;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.io.OutputStream;/** * @author Zhang,Tianyou * version:2014-11-20 下午2:45:24 * * */public class ObjectOutputStreamTest {/** * @param args * @throws IOException */public static void main(String[] args) throws IOException {// TODO Auto-generated method stubFile file = new File("d:" + File.separator + "test.txt");ObjectOutputStream oos = null;OutputStream outputStream = new FileOutputStream(file);oos = new ObjectOutputStream(outputStream);oos.writeObject(new Student("小明", 23));outputStream.close();oos.close();}}
其二进制数据结果如下如下:
二、ObjectInputStream对象输入流
能够将被序列化的对象反序列话。是InputStream的子类,实例化是必须接受一个InputStream输入流对象。
其主要方法如下:
1、public ObjectInputStream(InputStream in) throw IOException 构造方法
2、public final Object readObject() throw IOException, ClassNotFoundException 读取指定位置的对象
其实现如下:
package andy.serializable.test;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;/** * @author Zhang,Tianyou version:2014-11-20 下午2:45:46 * * */public class ObjectInputStreamTest {/** * @param args * @throws IOException * @throws ClassNotFoundException */public static void main(String[] args) throws IOException,ClassNotFoundException {// TODO Auto-generated method stubFile file = new File("d:" + File.separator + "test.txt");ObjectInputStream ois = null;InputStream inputStream = new FileInputStream(file);ois = new ObjectInputStream(inputStream);Object obj = ois.readObject();Student student = (Student) obj;ois.close();inputStream.close();System.out.println("test内容: name:" + student.getName() + "age:"+ student.getAge());}}
运行如下:
test内容: name小明age:23
三、也可以自定义序列化接口,可以指定自己希望序列化的内容,只需实现Externalizable接口。
四、Serializable接口实现的操作实际是将一个对象的全部属性进行了序列化,当然也可以通过Externalizable接口实现部分属性的序列化,但更简便的方法是使用transient关键字声明不需要序列化的接口。
例如:
private transient String name;
那么name是不会被序列化的。
- Java对象序列化原理以及Serializable接口
- Serializable对象序列化接口
- java 序列化 Serializable接口
- java序列化Serializable接口
- java序列化接口Serializable
- Java IO操作——对象序列化(Serializable接口、ObjectOutputStream、以及与Externalizable接口的用法和区别)
- 理解Java对象序列化——Serializable接口
- 理解Java对象序列化——Serializable接口
- 理解Java对象序列化——Serializable接口
- 理解Java对象序列化——Serializable接口
- 理解Java对象序列化——Serializable接口
- Java Serializable 对象序列化
- Serializable接口实现对象序列化
- 对象的序列化与Serializable 接口
- ObjectInutStream ObjectOutputStream 对象序列化原理 --- Serializable
- java 序列化 serializable 接口--详解!
- Java 可序列化接口Serializable总结
- java.io.Serializable接口实现序列化
- poj3260 The Fewest Coins
- 重写Arrays中的sort方法,实现数组的降序排序
- 公司
- Linux - 计划任务 [ at ]
- UE 高亮 一个或多个关键字的方法
- Java对象序列化原理以及Serializable接口
- Eclipse快捷键大全(转载)
- android preference介绍
- SecureCRT&SecureFX_v7.2.5_x86&x64_build_524 破解安装教程
- Two or more Web modules defined in the configuration have the same context root (/bms).
- 关于UIView的autoresizingMask属性的研究
- Linux内核zImage\Image\uImage之区别及uImage的制作
- 类 QQ登入界面的 布局,防登入按钮被覆盖
- shareSDK