Serializable序列化与反序列化编码实例
来源:互联网 发布:拆分盘系统源码 编辑:程序博客网 时间:2024/05/22 01:27
概述:当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以。
把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计
算机平台存在相应的类就可以正常恢复为原来的对象。
实现:要序列化一个对象,先要创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内,再调用writeObject()方法即可序列化一个对象;反序列化也类似。
import java.io.*;
public class Person implements Serializable {
private String userName;
private String password;
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Bruce", "123456"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
//序列化一个对象(存储到字节数组)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos2 = new ObjectOutputStream(baos);
oos2.writeObject("Save another object:\n");
oos2.writeObject(new Person("Phil", "654321"));
oos2.close();
//反序列化,将该对象恢复(存储到字节数组)
ObjectInputStream ois2 = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
s = (String)ois2.readObject();
p = (Person)ois2.readObject();
System.out.println(s + p);
}
}
//输入如下信息
Save a object:
userName:Bruce password:123456
Save another object:
userName:Phil password:654321
transient关键字:
自动序列化将对象的所有字段都持久化了,有时候需要对某些字段不进行自动化(如密码,因为序列化会暴光密码信息),这个时候可以使用transient关键字(只能和Serializable对象一起使
用),其作用是不序列化某些字段。将Person类的字段改为如下定义,再运行上面的程序:
private String userName;
private transient String password;
//输入如下信息
Save a object:
userName:Bruce password:null
Save another object:
userName:Phil password:null
控制序列化字段,甚至该字段是被transient修饰的字段也能将其序列化。手动序列化需要添加两个私有(private)方法(writeObject()和readObject()),在该私有方法中控制序列花字段。
import java.io.*;
public class Person implements Serializable {
private String userName;
private transient String password;
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); //序列化所有非transient字段,必须是该方法的第一个操作
out.writeObject(password); //序列化transient字段
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); //反序列化所有非transient字段,必须是该方法的第一个操作
password = (String)in.readObject(); //反序列化transient字段
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Bruce", "123456"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
}
}
//输入如下信息
Save a object:
userName:David password:13579
控制序列化字段还可以使用Externalizable接口替代Serializable借口。此时需要定义一个默认构造器,否则将为得到一个异常(java.io.InvalidClassException: Person; Person; no
valid constructor);还需要定义两个方法(writeExternal()和readExternal())来控制要序列化的字段。
import java.io.*;
public class Person implements Externalizable {
private String userName;
private String password;
public Person() {
System.out.println("default constructor invoked!");
}
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
public void writeExternal(ObjectOutput out) throws IOException {
//序列化字段
out.writeObject(userName);
out.writeObject(password);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
//反序列化字段
userName = (String)in.readObject();
password = (String)in.readObject();
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Leo", "1984"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
}
}
//输入如下信息
default constructor invoked!
Save a object:
userName:Leo password:1984
把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计
算机平台存在相应的类就可以正常恢复为原来的对象。
实现:要序列化一个对象,先要创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内,再调用writeObject()方法即可序列化一个对象;反序列化也类似。
import java.io.*;
public class Person implements Serializable {
private String userName;
private String password;
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Bruce", "123456"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
//序列化一个对象(存储到字节数组)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos2 = new ObjectOutputStream(baos);
oos2.writeObject("Save another object:\n");
oos2.writeObject(new Person("Phil", "654321"));
oos2.close();
//反序列化,将该对象恢复(存储到字节数组)
ObjectInputStream ois2 = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
s = (String)ois2.readObject();
p = (Person)ois2.readObject();
System.out.println(s + p);
}
}
//输入如下信息
Save a object:
userName:Bruce password:123456
Save another object:
userName:Phil password:654321
transient关键字:
自动序列化将对象的所有字段都持久化了,有时候需要对某些字段不进行自动化(如密码,因为序列化会暴光密码信息),这个时候可以使用transient关键字(只能和Serializable对象一起使
用),其作用是不序列化某些字段。将Person类的字段改为如下定义,再运行上面的程序:
private String userName;
private transient String password;
//输入如下信息
Save a object:
userName:Bruce password:null
Save another object:
userName:Phil password:null
控制序列化字段,甚至该字段是被transient修饰的字段也能将其序列化。手动序列化需要添加两个私有(private)方法(writeObject()和readObject()),在该私有方法中控制序列花字段。
import java.io.*;
public class Person implements Serializable {
private String userName;
private transient String password;
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); //序列化所有非transient字段,必须是该方法的第一个操作
out.writeObject(password); //序列化transient字段
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); //反序列化所有非transient字段,必须是该方法的第一个操作
password = (String)in.readObject(); //反序列化transient字段
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Bruce", "123456"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
}
}
//输入如下信息
Save a object:
userName:David password:13579
控制序列化字段还可以使用Externalizable接口替代Serializable借口。此时需要定义一个默认构造器,否则将为得到一个异常(java.io.InvalidClassException: Person; Person; no
valid constructor);还需要定义两个方法(writeExternal()和readExternal())来控制要序列化的字段。
import java.io.*;
public class Person implements Externalizable {
private String userName;
private String password;
public Person() {
System.out.println("default constructor invoked!");
}
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
public void writeExternal(ObjectOutput out) throws IOException {
//序列化字段
out.writeObject(userName);
out.writeObject(password);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
//反序列化字段
userName = (String)in.readObject();
password = (String)in.readObject();
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Leo", "1984"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
}
}
//输入如下信息
default constructor invoked!
Save a object:
userName:Leo password:1984
0 0
- Serializable序列化与反序列化编码实例
- 序列化和反序列化C# [Serializable] 与[Serializable()]
- Serializable 接口与 Java 序列化与反序列化
- Java序列化与反序列化(Serializable)
- java 序列化 Serializable 与 反序列化 总结
- JAVA序列化与反序列化基础 Serializable
- Java序列化(Serializable)与反序列化
- Java序列化(Serializable)与反序列化
- Serializable的序列化与反序列化
- Java序列化(Serializable)与反序列化
- Java序列化(Serializable)与反序列化
- 8 Serializable序列化与反序列化
- Java序列化(Serializable)与反序列化
- java 序列化Serializable与反序列化DeSerializable
- Java序列化与反序列化(Serializable&&Externalizable)
- Serializable的序列化与反序列化
- 对象序列化与反序列化(Serializable、Externalizable )
- Serializable对象序列化与反序列化
- IOS App提交到appStore Missing 64-bit support
- jdbc通用查询实例
- MTA统计功能接入指引
- 自行封装Jquery的ajax的form方法
- 前台传过来来好几个对象,后台同时接受这几个相同的javabean: 实践总结
- Serializable序列化与反序列化编码实例
- C++primer(第五版)8.2.2节练习答案
- Android高性能编程
- JAVA中各种IO的关系及说明
- 44444444444444444
- ORACLE时区
- 敏捷实践——“钱掌柜”分流发布模式
- 培养了用户通过微信支付及使用的习惯
- SEU寒假训练题解二 H Codeforces 435D