下面是Java对象Serializable接口实现的详细攻略:
什么是Serializable接口?
Serializable是Java中的一个接口,用于将Java对象转换成字节序列以便于在网络上传输或者进行持久化存储。通过实现Serializable接口,Java对象可以被序列化为一个字节数组,保存到内存或输出到磁盘或网络。实现Serializable接口的类必须满足如下条件:
- 该类必须实现Serializable接口,没有实现Serializable接口的类不能被序列化.
- 该类所有属性也必须是可序列化的,否则必须标记为transient。
如何实现Serializable接口?
要实现Serializable接口,只需要在类声明中加入“implements Serializable”关键字即可。
public class User implements java.io.Serializable {
private int id;
private String name;
// getter和setter方法
}
如上面的例子所示,User类实现了Serializable接口。
序列化对象
在Java中,有两个主要的序列化类,ObjectInputStream和ObjectOutputStream。接下来我们通过使用这两个类,来序列化和反序列化一个Java对象。
首先,我们需要将一个Java对象转换成一个字节数组,就像这样:
public byte[] serialize(User user) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(user);
return baos.toByteArray();
}
上述代码中,我们创建了一个ByteArrayOutputStream对象以及一个ObjectOutputStream对象,然后调用writeObject()方法将一个User对象序列化成一个字节数组。最后,我们返回这个字节数组。
反序列化对象
完成序列化后,我们需要将这个字节数组还原为一个Java对象。这里是反序列化的代码示例:
public User deserialize(byte[] data) throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais);
return (User)ois.readObject();
}
上述代码中,我们通过ByteArrayInputStream和ObjectInputStream的组合,从字节数组中读取数据。然后我们将其转换为User对象并返回。
示例1
我们拿User类来举一个示例,代码如下:
package com.example.serializable;
import java.io.*;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
public User() {}
public User(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
User user = new User(1, "tom");
System.out.println("序列化前:" + user.toString());
// 序列化对象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(user);
// 反序列化对象
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
User user1 = (User) ois.readObject();
System.out.println("序列化后:" + user1.toString());
}
}
执行程序后,输出结果如下:
序列化前:User{id=1, name='tom'}
序列化后:User{id=1, name='tom'}
示例2
我们拿Student类举一个复杂点的示例,代码如下:
package com.example.serializable;
import java.io.*;
public class Student implements Serializable {
private static final long serialVersionUID = -5498035777624124029L;
private int id;
private String name;
private transient int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
Student student = new Student(1, "tom", 18);
System.out.println("序列化前:" + student.toString());
// 序列化对象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(student);
// 反序列化对象
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Student student1 = (Student) ois.readObject();
System.out.println("序列化后:" + student1.toString());
}
}
在上面的示例中,我们定义了一个Student类,并在这个类中使用了transient关键字将age属性标记为不可序列化。执行程序后,输出结果如下:
序列化前:Student{id=1, name='tom', age=18}
序列化后:Student{id=1, name='tom', age=0}
从输出结果中可以看出,age属性的值在反序列化后变成了0。
以上就是Java对象Serializable接口实现的详细攻略,感谢阅读。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对象Serializable接口实现详解 - Python技术站