
文章目录序列化示例serialVersionUID的作用是什么?不写serialVersionUID会有什么问题?某个字段不想序列化怎么办?序列化有哪些要求?比较基础的概念也记录下。概念将内存中的对象状态转换成某种可以存储或传输的格式如二进制、文本(json、xml)等。序列化 对象-可存储或传输格式反序列化可存储或传输格式-对象序列化示例1、定义User类importjava.io.Serializable;// 实现 Serializable 标记接口publicclassUserimplementsSerializable{// 序列化版本号用于验证版本一致性privatestaticfinallongserialVersionUID1L;privatetransientStringname;privateintage;publicUser(Stringname,intage){this.namename;this.ageage;}OverridepublicStringtoString(){returnUser{namename, ageage};}}2、序列化和反序列化代码importcom.example.demo.entity.User;importjava.io.*;publicclassSerializationDemo{publicstaticvoidmain(String[]args){UserusernewUser(Alice,25);StringfileNameuser.ser;// 1. 序列化将对象写入文件try(ObjectOutputStreamoosnewObjectOutputStream(newFileOutputStream(fileName))){oos.writeObject(user);System.out.println(序列化成功: user);}catch(IOExceptione){e.printStackTrace();}// 2. 反序列化从文件读取并还原对象try(ObjectInputStreamoisnewObjectInputStream(newFileInputStream(fileName))){// readObject() 返回的是 Object 类型需要强转为 UserUserdeserializedUser(User)ois.readObject();System.out.println(反序列化成功: deserializedUser);}catch(IOException|ClassNotFoundExceptione){e.printStackTrace();}}}serialVersionUID的作用是什么?用于标识这个类是同一个类避免因修改属性等造成jvm认为不是同一个类而反序列化失败的问题。不管什么类用如下固定写法就行jvm会自动处理// 序列化版本号用于验证版本一致性privatestaticfinallongserialVersionUID1L;不写serialVersionUID会有什么问题?不写serialVersionUID的情况下假如场景如下1、User类先进行了序列化。2、后来加了一个属性email因为类结构发生变化jvm会重新计算hashcode生成一个全新serialVersionUID这样在反序列化时就会失败。代码StringfileNameuser.ser;// 2. 反序列化从文件读取并还原对象try(ObjectInputStreamoisnewObjectInputStream(newFileInputStream(fileName))){// readObject() 返回的是 Object 类型需要强转为 UserUserdeserializedUser(User)ois.readObject();System.out.println(反序列化成功: deserializedUser);}catch(IOException|ClassNotFoundExceptione){e.printStackTrace();}会报错com.example.demo.entity.User; local class incompatible: stream classdesc serialVersionUID 8589669512230966022, local class serialVersionUID 7295697305919654935某个字段不想序列化怎么办?用transient修饰即可。序列化有哪些要求?1、必须有无参构造器在反序列化时会new一个对象再实现反序列化如果没有无参构造器程序不知道传什么参数实现初始化2、字段必须有对应的getter()、setter()方法且访问权限要为public否则该字段访问不了。3、内部类必须是static的4、如果是二进制等原生序列化需要实现serializable接口并添加serialVersionUID。