package serializ;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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 java.io.Serializable;
/**
* 自定义序列化 默认的序列化机制是自动完成的,
* 如果想要修改序列化过程 要实现几个private级别方法
* private void writeObject(ObjectOutputStream oos)
* private void readObject(ObjectInputStream ois)
* 并且该类还是正常实现Serializable接口,按照正常方式序列化
* 不过在序列化过程中会自动调用你实现的 writeObject和readObject方法
*
* @author yli
*
*/
public class CustomSerializable {
public static void main(String[] args) {
String file = "src/serializ/account.dat";
Account acc = new Account("100034", 200d);
System.out.println(acc);
writeObject(acc, file);
Account acc1 = (Account) readObject(file);
System.out.println(acc1);
}
// 序列化对象
private static void writeObject(Object obj, String file) {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
oos.writeObject(obj);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 反序列化
private static Object readObject(String file) {
ObjectInputStream ois = null;
Object obj = null;
try {
ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
obj = ois.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return obj;
}
}
/**
* 实现writeObject和readObject方法
* @author liyu
*
*/
class Account implements Serializable{
private static final long serialVersionUID = 1589558240016731037L;
String name;
double balance;
public Account(String name, double balance) {
this.name = name;
this.balance = balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String toString(){
return String.format("{name:%s,balance=%s}", name, balance);
}
private void writeObject(ObjectOutputStream oos) throws IOException {
// defaultWriteObject会自动把类的描述信息以及签名写入
// 并且将String类型字段自动write
oos.defaultWriteObject();
// 因此此处指write了balance字段
oos.writeDouble(balance);
}
private void readObject(ObjectInputStream ois)
throws ClassNotFoundException, IOException {
// defaultReadObject会自动把类的描述信息以及签名写入
// 并且将String类型字段自动read出来
ois.defaultReadObject();
// 因此此处只read了balance字段
ois.readDouble();
}
}
Serializable序列化(三)
最新推荐文章于 2024-08-22 16:24:19 发布