什么是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();
}