在Java开发中,Serializable是一个很常用的接口,简单来说就是将一个对象转换为可存储或传输的形式,也就是序列化。而反序列化则是将已序列化的对象还原成可用对象的过程。Serializable接口一般用于将对象的实例存储到文件或者在网络上传输,以方便数据的传递和存储。
在Java中,实现Serializable接口,需要重写writeObject()和readObject()方法,这两个方法用来序列化对象和反序列化对象。实现了Serializable接口的类,可以使用ObjectOutputStream类的writeObject方法把对象序列化到文件或者其他地方,而反序列化则是使用ObjectInputStream的readObject方法。以下是一个简单的例子:
```
import java.io.*;
public class User implements Serializable{
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(username);
out.writeObject(password);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
username = (String) in.readObject();
password = (String) in.readObject();
}
}
public class Main {
public static void main(String[] args) {
User user = new User("lukelin1989", "123456");
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user.ser"));
out.writeObject(user);
out.close();
}catch (IOException e1) {
e1.printStackTrace();
}
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.ser"));
User newUser = (User) in.readObject();
in.close();
System.out.println(newUser.getUsername());
System.out.println(newUser.getPassword());
}catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
```
需要注意的是,实现Serializable接口的类必须明确指定一个版本号,否则在序列化和反序列化的过程中会出现版本不一致的问题。可以通过显式声明serialVersionUID值来解决这个问题。在Java中,serialVersionUID是用来验证版本一致性的。在反序列化过程中,系统会把传来的字节流中的serialVersionUID和本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现版本不一致的异常。
另外,因为序列化和反序列化是由Java底层实现的,所以需要保证被序列化的对象和其中的所有域都是可序列化的,否则会抛出NotSerializableException异常。如果我们的类中有一个引用类型的成员变量,而该引用类型并没有实现Serializable接口,那么就需要在该成员变量前加上transient关键字,表示该成员变量不用序列化。下面是一个例子:
```
import java.io.*;
public class Address implements Serializable {
private String city;
private String state;
private String zipCode;
public Address(String city, String state, String zipCode) {
this.city = city;
this.state = state;
this.zipCode = zipCode;
}
public String getCity() {
return city;
}
public String getState() {
return state;
}
public String getZipCode() {
return zipCode;
}
}
public class User implements Serializable{
private String username;
private transient String password;
private Address address;
public User(String username, String password, Address address) {
this.username = username;
this.password = password;
this.address = address;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public Address getAddress() {
return address;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(username);
out.writeObject(address.getCity());
out.writeObject(address.getState());
out.writeObject(address.getZipCode());
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
username = (String) in.readObject();
String city = (String) in.readObject();
String state = (String) in.readObject();
String zipCode = (String) in.readObject();
address = new Address(city, state, zipCode);
}
}
public class Main {
public static void main(String[] args) {
User user = new User("lukelin1989", "123456", new Address("Shanghai", "Shanghai", "200000"));
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user.ser"));
out.writeObject(user);
out.close();
}catch (IOException e1) {
e1.printStackTrace();
}
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.ser"));
User newUser = (User) in.readObject();
in.close();
System.out.println(newUser.getUsername());
System.out.println(newUser.getPassword());
System.out.println(newUser.getAddress().getCity());
System.out.println(newUser.getAddress().getState());
System.out.println(newUser.getAddress().getZipCode());
}catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
```
综上,Serializable是Java中一个非常重要的接口,可以实现对象序列化和反序列化,方便网络传输和对象存储等操作。在使用Serializable时需要注意类中所有的域都必须是可序列化的,如果有非可序列化的域可以使用transient关键字来避免序列化。同时需要明确指定serialVersionUID,以避免版本不一致的问题。
购买后如果没出现相关链接,请刷新当前页面!!!
链接失效的请留言 ,我看见了就补上!!!
网站内容来源于互联网,我们将这些信息转载出来的初衷在于分享与学习,这并不意味着我们站点对这些信息的观点或真实性作出认可,我们也不承担对这些信息的责任。
适度游戏益脑,沉迷游戏伤身。 合理安排时间,享受健康生活。适龄提示:适合18岁以上使用!
发表评论 取消回复