对象的序列化与反序列化
来源:互联网 发布:金庸小说 知乎 话题 编辑:程序博客网 时间:2024/05/16 13:03
对象序列化就是把一个对象变为二进制的数据流的一种方法。通过对象序列化可以方便地实现对象的传输或存储。
如果一个类的对象想被序列化,则对象所在的类必须实现java.io.Serializable接口。此接口的定义如下
public interface Serializable{}
此接口中没有定义任何的方法,所以此接口是一个标识接口。实现此接口的类表示已经具备了序列化的能力。
例:定义可序列化的类
class Person implements Serializable{ private String name; public Person(String name) { this.setName(name); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "my name is "+this.name; }}
以上的类已经具备序列化的能力。所以此类的对象是可以经过二进制数据流进行传输的。而如果要完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream)。
使用对象输出流输出序列化对象的步骤有时称为序列化,而使用对象输入流输入对象的过程称为反序列化。
1.对象输出流 ObjectOutputStream
一个对象如果要进行输出,则必须使用对象输出流ObjectOutputStream类。
例:将Person类的对象保存在文件中
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.io.Serializable;public class Main { public static void main (String args[]) throws Exception { String path="E:"+File.separator+"t.txt"; File f=new File(path); ObjectOutputStream oos=null; OutputStream out=new FileOutputStream(f); //文件输出流 oos=new ObjectOutputStream(out); //为对象输出流实例化 oos.writeObject(new Person("xinghang")); //保存对象到文件 oos.close(); //关闭输出 } }
注意:一个对象被序列化后,只有对象中的属性被保存下来了,而方法则没有别保存。
2.对象输入流 ObjectInputStream
例:从文件中将Person对象反序列化(读取)
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.io.Serializable;public class Main { public static void main (String args[]) throws Exception { String path="E:"+File.separator+"t.txt"; File f=new File(path); ObjectInputStream ois=null; InputStream in=new FileInputStream(f); //文件输出流 ois=new ObjectInputStream(in); //实例化对象输入流 Object o=ois.readObject(); //读取对象 ois.close(); System.out.println(o); } }
3.transient 关键字
当使用Serializable接口实现序列化操作时,如果一个对象中的某个属性不希望被序列化,则可以使用transient关键字进行声明,代码如下:
class Person implements Serializable{ private transient String name; public Person(String name) { this.setName(name); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "my name is "+this.name; }}
此时,若对Person类的实例化对象进行序列化,那么其中name属性将不会被保存。在进行反序列化时,读取name的值也为null。
0 0
- 对象序列化与反序列化
- 序列化与反序列化对象
- 对象序列化与反序列化
- 对象序列化与反序列化
- 对象序列化 与反序列化
- 对象序列化与反序列化
- 对象序列化与反序列化
- 对象序列化与反序列化
- 对象序列化与反序列化
- C#对象的 Xml序列化与反序列化
- Symbian 流的对象序列化与反序列化
- Symbian 流的对象序列化与反序列化
- C#中对象的序列化与反序列化
- Java 对象的序列化与反序列化实践
- 对象的序列化与反序列化
- C#中对象的序列化与反序列化
- 对象的序列化与反序列化
- C#中对象的序列化与反序列化
- Linux下安装配置JDK
- android开发笔记(1-5)(易错点以及技术难点攻克)
- const,enum,inline替换#define
- C++特别注意的特性
- 指令系统--题目
- 对象的序列化与反序列化
- C# 实现Excel转Word、Word转PDF、合并PDF
- Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition) 阅读笔记(Part V)
- GOF23之原型模式Demo
- Linux中各目录含义
- linux i2c 24c08 tiny6410 一个24c08的设备驱动
- 堆和栈的区别
- 优化Linux下的内核TCP参数以提高系统性能
- java中URL和File的相互转化