``
- [](https://en.wikipedia.org/wiki/Java_remote_method_invocation)
java
``public class Person implements Serializable {
private String name;
private int age;
public Person() {
System.out.println("无参构造.");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造.");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
java
public class SerializableTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person = new Person("zhangsan", 24);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("abc.txt"));
oos.writeObject(person);
oos.close();
}
}
java
有参构造.
java
public class SerializableTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("abc.txt"));
Person p = (Person) ois.readObject();
System.out.println(p);
}
java
****Person{name='zhangsan', age=24}
java
// 没有实现序列化接口
public class Person{
private String name;
private int age;
public Person() {
System.out.println("无参构造.");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造.");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
java
// 实现了序列化接口
public class Teacher implements Serializable {
private String name;
private Person person;
public Teacher(String name, Person person) {
this.name = name;
this.person = person;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", person=" + person +
'}';
}
}
java
public class SerializableTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person = new Person("zhangsan", 24);
Teacher t = new Teacher("lisi", person);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("abc.txt"));
oos.writeObject(t);
oos.close();
}
}
java
有参构造.
Exception in thread "main" java.io.NotSerializableException: other.Person
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at other.SerializableTest.main(SerializableTest.java:10)
java
// 检查一:代码省略
...
// 检查二:代码省略
...
// 检查三:
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum<?>) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
java
import java.io.*;
public class ExPerson implements Externalizable {
private String name;
private int age;
public ExPerson() {
System.out.println("无参构造.");
}
public ExPerson(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造.");
}
@Override
public String toString() {
return name + age;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
System.out.println("writeExternal() method.");
out.writeObject(name);
out.writeInt(age);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
System.out.println("readExternal() method.");
name = (String) in.readObject();
age = in.readInt();
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
ExPerson exPerson = new ExPerson("zhangsan", 25);
System.out.println(exPerson);
// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("123.txt"));
System.out.println("保存对象:");
oos.writeObject(exPerson);
oos.close();
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("123.txt"));
System.out.println("接收对象:");
exPerson = (ExPerson) ois.readObject();
System.out.println(exPerson);
}
}
java
有参构造.
zhangsan25
保存对象:
writeExternal() method.
接收对象:
无参构造.
readExternal() method.
zhangsan25
````java
import java.io.*;
public class Person implements Serializable {
private transient String name;
private transient int age;
private int height;
public Person() {
System.out.println("无参构造.");
}
public Person(String name, int age, int height) {
this.name = name;
this.age = age;
this.height = height;
System.out.println("有参构造.");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
'}';
}
}
java
````有参构造.
Person{name='null', age=0, height=180}
<font style="color:rgb(199, 37, 78);background-color:rgb(240, 242, 245);">transient</font>
- ``****``
java
public class StaticSerializableTest implements Serializable {
private static int age = 25;
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("staticSerializable.txt"));
oos.writeObject(new StaticSerializableTest());
oos.close();
// 修改静态变量的值
StaticSerializableTest.age = 30;
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("staticSerializable.txt"));
StaticSerializableTest ss = null;
ss = (StaticSerializableTest) ois.readObject();
System.out.println(ss.age);
}
}
java
****30
****``````- ``
- ``
- ``
- ``
````java
public class Singleton implements Serializable {
private volatile static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
java
``public class SerializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("456.txt"));
oos.writeObject(Singleton.getInstance());
oos.close();
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("456.txt"));
Singleton newSingleton = (Singleton)ois.readObject();
// 比较是否相等
System.out.println(Singleton.getInstance() == newSingleton);
}
}
java
````Object obj;
try {
obj = desc.isInstantiable() ? desc.newInstance() : null;
} catch (Exception ex) {
throw (IOException) new InvalidClassException(desc.forClass().getName(),
"unable to create instance").initCause(ex);
}
java
if (obj != null &&
handles.lookupException(passHandle) == null &&
desc.hasReadResolveMethod())
{
Object rep = desc.invokeReadResolve(obj);
if (unshared && rep.getClass().isArray()) {
rep = cloneArray(rep);
}
if (rep != obj) {
// Filter the replacement object
if (rep != null) {
if (rep.getClass().isArray()) {
filterCheck(rep.getClass(), Array.getLength(rep));
} else {
filterCheck(rep.getClass(), -1);
}
}
handles.setObject(passHandle, obj = rep);
}
}
java
public class Singleton implements Serializable {
private volatile static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
// 添加 readResolve 方法
public Object readResolve() {
return instance;
}
}