//大量的反射,创建很多的临时变量,导致内存碎片,Serializable缺点
/**
* 子类实现序列化,父类没有实现序列化,会报错
*/
package com.anny.protobuf.serializable;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* Created by zhanghongyan on 2020/4/6.
*/
public class SerializableUtils {
public static <T> byte[] serialize(T t) throws Exception{
//Anny a.静态成员变量属于类不属于对象,所以不会参与序列化(对象序列化保存的是对象的“状态”,也就是它的成员变量,因此序列化不会关注静态变量)
//Anny b.用transient关键字标记的成员变量不参与序列化(在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null)
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(t);
return out.toByteArray();
}
public static <T> T deserialize(byte[] bytes) throws Exception{
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
T t = (T) ois.readObject();
return t;
}
/**
* 序列化对象
* @param obj
* @param path
* @return
*/
synchronized public static boolean saveObject(Object obj, String path){
if (obj == null){
return false;
}
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(path));
oos.writeObject(obj);
oos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null){
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
/**
* 非序列化对象
* @param path
* @param <T>
* @return
*/
synchronized public static <T> T readObject(String path){
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(path));
return (T) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null){
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
public class Main {
public static void main(String[] args) throws Exception {
test01();
}
private static void test01() throws Exception {
Student student = new Student("Anny", "women", 31);
student.addCourse(new Course("English", 90f));
student.addCourse(new Course("math", 99f));
byte[] bytes = SerializableUtils.serialize(student);
String path = System.getProperty("user.dir") + "\\SerializableDemo\\src\\main\\DemoStudent.out";
SerializableUtils.saveObject(student, path);
System.out.println(Arrays.toString(bytes));
System.out.println("=========================================");
Student student1 = SerializableUtils.deserialize(bytes);
student1.newDate();
System.out.println("Student: " + student1);
}
}
public static void main(String[] args) throws Exception {
Course course = new Course("English", 90f);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
oos.writeObject(course);
course.setScore(80f);
oos.reset();
oos.writeObject(course);
//oos.writeUnshared(course);//Anny 大坑
byte[] bytes = outputStream.toByteArray();
oos.close();
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
Course course1 = (Course)ois.readObject();
Course course2 = (Course)ois.readObject();
//Course course3 = (Course)ois.readObject();
System.out.println("course1: " + course1);
System.out.println("course2: " + course2);
//System.out.println("course3: " + course3);
}