序列化就是将对象改成二进制的一个过程,为了将对象保存到磁盘或者网络发送。
实现序列化一个四个方式
前两种序列化方法的区别
https://blog.csdn.net/newchitu/article/details/90676537
Externalizable接口扩展自java.io.Serializable接口。实现java.io.Serializable即可获得对类的对象的序列化功能。而Externalizable可以通过writeExternal()和readExternal()方法可以指定序列化哪些属性。 Externalizable需要一个无参数构造去重新反序列化时候构造自己函数
- Ser方法,没法指定哪些内容可以序列化,那些内容没法序列化灵活性不够
- Ser方法不会调用默认构造方法,而ex方法会在反序列化时候默认调用构造方法去构造对象
3.Ser方法需要序列化Id,而ex方法并不需要
https://securitit.blog.csdn.net/article/details/106694445?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-106694445-blog-90676537.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-106694445-blog-90676537.pc_relevant_antiscanv2&utm_relevant_index=1
https://my.oschina.net/wangmengjun/blog/1588096
序列化流的操作
就是进行序列化用的流而已
https://www.cnblogs.com/sun-10387834/p/13521725.html
经过本人亲自测试
package com.bjsxt;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
public class Dog implements Externalizable {
private String name = "我是狗";
private int age = 12;
public Dog() {
this.name = "我是猫";
this.age = 13;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name);
out.writeInt(age);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = (String)in.readObject();
age = in.readInt();
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + ''' +
", 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;
}
}
Externalizable接口,最终会在重新构建对象时候,调用无参构造器方法对对象进行构造,被反序列化回来的的对象数据,和无参构造是一莫一样的。可以用无参构造来构造对象。
加上参数构造会报错。
顺带一提我的序列化工具
package com.bjsxt;
import java.io.*;
public class SerializationUtil {
public static Object deserialize(String fileName) throws IOException,
ClassNotFoundException {
FileInputStream fis = new FileInputStream(fileName);
BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream ois = new ObjectInputStream(bis);
Object obj = ois.readObject();
ois.close();
return obj;
}
public static void serialize(Object obj, String fileName)
throws IOException {
FileOutputStream fos = new FileOutputStream(fileName);
BufferedOutputStream bos = new BufferedOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.close();
}
}
和测试类
package com.bjsxt;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Dog dog = new Dog();
//book==>Book [name=Hello Java, isbn=ABC123456789, authors=[John, Eric]]
System.out.println("book==>" + dog);
String fileName = "d:/a.txt";
SerializationUtil.serialize(dog, fileName);
Dog deserializedBook = (Dog) SerializationUtil.deserialize(fileName);
//deserializedBook==>Book [name=Hello Java, isbn=ABC123456789, authors=[John, Eric]]
System.out.println("deserializedBook==>" + deserializedBook);
}
}
结论就是EX接口最终还是是通过无参构造中的数据来创造了反序列化后的对象。里面可以调用无参构造
防止成员被序列化1.声明成静态变量
序列化·是对象的问题,跟类无关
2.tranisent序列化的时候防止序列化



