java model 序列化_Java序列化和反序列化

Java中的对象序列化意思也就是说用来存储或者传输Java对象, 反序列化就是将存储起来的Java对象或者传输过来的流转化为Java对象的操作,具体的序列化操作和注意事项如下:

首先创建一个普通的Java对象, 不实现java.io.Serializable接口;

/*** 普通的Java对象 (未实现java.io.Serializable接口)*/

public classSerializableModel{privateString id;publicString getId() {returnid;

}public voidsetId(String id) {this.id =id;

}

}

main测试类如下:

/*** main测试类*/

public classMainTest {public static void main(String[] args) throwsException{

serialObj();

}/*** 序列化操作

*@throwsIOException*/

public static void serialObj() throwsIOException {

SerializableModel model= newSerializableModel();

model.setId("33333");

FileOutputStream fileOutputStream= new FileOutputStream("d://tmp/test.txt");

ObjectOutputStream outputStream= newObjectOutputStream(fileOutputStream);

outputStream.writeObject(model);

outputStream.close();

fileOutputStream.close();

}/*** 反序列化操作

*@throwsIOException

*@throwsClassNotFoundException*/

public static void unserialObj() throwsIOException, ClassNotFoundException {

SerializableModel model= null;

FileInputStream fileInputStream= new FileInputStream("d://tmp/test.txt");

ObjectInputStream inputStream= newObjectInputStream(fileInputStream);

model=(SerializableModel) inputStream.readObject();

inputStream.close();

fileInputStream.close();

System.out.println(model.getId());

}

}

执行序列化方法, 此时会抛出序列化异常,如下:

de79d5ba7d645040dc073f1d45f55f48.png

这是因为没有实现java.io.Serializable接口, Java规定需要序列化的类都需要实现该接口, 表示对象可序列化, 没有任何方法需要实现, 仅仅是作为一个标识, 接下来我们再实现这个接口:

/*** 普通的Java对象(实现序列化接口)*/

public class SerializableModel implementsSerializable {privateString id;publicString getId() {returnid;

}public voidsetId(String id) {this.id =id;

}

}

继续执行main方法中的序列化方法, 执行成功, 生成的文本如下:

 sr exception.SerializableModel?nQヱ L idt Ljava/lang/String;xpt 33333

这个应该是保存下来的字节码文件, 可以看到JavaBean的名称和属性id以及属性值33333.

接下来我们再给Java对象加上一个序列化版本号:

/*** 普通的Java对象(实现序列化接口, 带序列化版本号)*/

public class SerializableModel implementsSerializable {private static final long serialVersionUID = 0L;privateString id;publicString getId() {returnid;

}public voidsetId(String id) {this.id =id;

}

}

我们再把main方法中的serialObj()方法替换成反序列化方法unserialObj()试试看:

public static void main(String[] args) throwsException{

unserialObj();

}

ccd72dd9d0a07b0353b66f7f915e1bee.png

可以看到, 抛出了异常信息, 意思大概就是从流中读取的类描述信息看到的序列化版本号是-2017031617106284276(这个版本号是Java自动生成的, 因为没有指定版本号, 会自动生成一个), 而我们自己定义的序列化版本号是0, 版本不相同, 不能进行转化,所以报错.

我们把版本号去掉再试试看:

aba885c84e53ac2d00d4532a5e05fef7.png

此时通过了编译并且打印了Java对象的id.

总结, Java对象序列化是为了传输或者存储Java对象的, 需要序列化的对象必须实现java.io.Serializable接口, 尽量设置一个序列化版本号并且在修改了Java对象属性的时候手动去修改版本号避免反序列化的时候由于属性缺失造成转化出来的Java对象不完整而导致不必要的业务逻辑处理失败事件.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值