java bean serializable_JavaBean与Serializable

什么是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变量读回来

b94c4938d84e4fe7bb9f33e375690ebb.png

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

a29a238f7d414c3d9805538742fa253b.png

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();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值