JavaBean与Serializable

发布于 2020-01-12  210 次阅读


什么是JavaBean

最简单的说法

一个类,实现了Serializable接口,而且类中属性都是private,而且每个属性都有对应的get/set方法,那他就是一个JavaBean。

详细点的说法

JavaBean仅仅是一个标准,所有的属性都是private,只使用对应的getters/setters来获取设置值,有一个无参构造函数,实现Serializable接口,这个 Serializable 接口是相当重要的,后面会详细说一下,下面放一下一个符合JavaBean标准的类

public class BaseDto implements Serializable {
    public BaseDto() {}
    private Long id;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}

什么是Serializable接口

首先放一段官方的说明:一个类如果实现了  java.io.Serializable 接口,那么他就可以被序列化,反之,则不能,所有Serializable的子类都可以被序列化,而Serializable接口没有任何方法和字段,仅仅是一个含义,可以看一下他的代码

 * @see java.io.ObjectOutputStream
 * @see java.io.ObjectInputStream
 * @see java.io.ObjectOutput
 * @see java.io.ObjectInput
 * @see java.io.Externalizable
 * @since   JDK1.1
 */
public interface Serializable {
}

为什么使用Serializable

首先,最重要的一点,就是使得对象可以被转换为一组byte,存储在任意地方,而你使用时,通过这一组byte就可以重新拿到这个对象,也就是持久化,还有是可以转成JSON字符串,存储在任意地方,然后用时再序列化回来就行。

其次,就是传输对象,假如你某个对象想发送到另一个应用程序中,或者网络传输过去,如果对象不能序列化你该怎么传送?总不能手动转成固定格式字符串,然后转字节再传送,对方拿到后再按照格式分析创建对应的对象吧?也太麻烦了。

而且对象中,某些属性是引用类型的话,又是一个对象,这如何自己去解析那也就太麻烦了

序列化的注意事项

  • 当一个对象被序列化时,只保存对象的非静态成员变量(包括声明为private的变量),不能保存任何的成员方法和静态的成员变量。
  • 如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被序列化。
  • 如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。

什么情况下需要序列化

  • 当你想把的内存中的对象保存到一个文件中或者数据库中时候
  • 当你想用套接字在网络上传送对象的时候
  • 当你想通过RMI传输对象的时候

实践一把

我们将一个对象,以及一个整数序列化后写入到文件中,然后再读取出来,下面放Idea的调试图

可以看到,先用ObjetOutputStream将User对象以及一个int变量写入到文件中,然后再用ObjectInputStream将这个User对象和int变量读回来

我们看一下这个test.txt文件里的内容,可以看到部分明文内容,jjjava.User类,属性id以及username还有他俩的值

  public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User();
        user.setId("1");
        user.setUserName("user1");
        FileOutputStream fos = new FileOutputStream("F:\\test.txt");
        ObjectOutputStream os = new ObjectOutputStream(fos);
        os.writeObject(user);
        os.writeInt(65535);
        os.flush();

        FileInputStream fis = new FileInputStream("F:\\test.txt");
        ObjectInputStream is = new ObjectInputStream(fis);
        User user1 = (User) is.readObject();
        int n = is.readInt();

        fos.close();
        os.close();
        fis.close();
        is.close();
    }

LoneKing