Serializable深入理解,-,lukelin1989,-,办公软件在哪自学

在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岁以上使用!

点赞(41) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部