JavaSE---对象序列化与反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /** * 【对象的序列化与反序列化】 * 1、当 2个进程 远程通信时,彼此都可以发送各种类型的数据,如文本、图片、语音、视频等; * 无论是何种类型的数据,都会以 二进制序列 的形式在网络上传送; * * 2、对象的序列化: * 把Java对象 转换为 字节序列; * * 对象的反序列化: * 把字节序列 转为 为 Java对象; * * 3、对象序列化的用途: * 把对象的字节序列 永久 保存在磁盘,通常放在一个文件中; * 在网络上 传送 对象的字节序列; */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * 【JDK类库的序列化API】 * * 只有实现了 java.io.Serializable或java.io.Externalizable 接口的对象 才能被 序列化,否则 将会 抛出 IOException; * * java.io.ObjectOutputStream: * 对象输出流; * writeObject 对指定的对象 进行序列化,将 得到的字节序列 写入到目标输出流中; * * java.io.ObjectInputStream: * 对象输入流; * readObject 从输入流中 读取字节序列,将字节序列 反序列化为 Java对象; * * java.io.Serializable: * 仅实现Serializable的类 采用 默认的序列化方式; * 默认序列化方式: * 对实现类的非transient实例变量进行序列化; * static 变量也不会序列化; * 默认反序列化方式: * 对实现类的非transient实例变量进行反序列化; * * java.io.Externalizable: * 继承自Serializable,实现Externalizable的类 完全 由自身 控制 序列化的行为; * */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /** * 【控制序列化行为】 * 1、自定义类型 实现 java.io.Serializable * 自定义 * private void writeObject(ObjectOutputStream stream)throws IOException {} * private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {} * * 【修饰符必须为private】 * * 2、自定义类型 实现 java.io.Externalizable * 重写 * void writeExternal(ObjectOutput out) throws IOException; * void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; * * 3、自定义类型 实现 java.io.Serializable * 自定义 * private Object readResolve() throws ObjectStreamException{} * 重新指定反序列化得到的对象; * private Object writeReplace(){} * 重新指定序列化的对象,此方法返回的对象才是 真正的序列化对象 * * 【修饰符可以为private、protected、默认】 * */ |
1 2 3 4 5 6 7 | /** * 【可序列化类的版本】 * 凡是实现java.io.Serializable接口的类,都有一个表示 序列化版本的常量 private static final long serialVersionUID(Java运行时环境 根据类的内部细节 自动生成的); * 如果源码做了修改,需要重新编译,新生成的class文件的serialVersionUID也会变化; * * 为了提高serialVersionUID的独立性和确定性,建议在可序列化类中 显式指定 serialVersionUID; */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | import java.io.Externalizable; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.io.ObjectStreamException; import java.io.Serializable; /** * @author apy * @description * @date 2022/2/23 15:12 */ public class Test { public static void main(String[] args) throws IOException, ClassNotFoundException { // User user = new User(); // user.setAge(1); // user.setName("jack"); // User.setJob("teacher"); BUser bUser = new BUser(); bUser.setName( "rose" ); bUser.setAge( 2 ); ObjectOutputStream objectOutputStream = new ObjectOutputStream( new FileOutputStream( "/Users/an/IdeaProjects/demo/javase/src/main/java/com/an/serilaizedeserilaize/user.obj" )); objectOutputStream.writeObject(bUser); ObjectInputStream objectInputStream = new ObjectInputStream( new FileInputStream( "/Users/an/IdeaProjects/demo/javase/src/main/java/com/an/serilaizedeserilaize/user.obj" )); Object object = objectInputStream.readObject(); System.out.println(object); } } class User implements Serializable{ private static final long serialVersionUID = 1L; transient int age; String name; static String job; public static String getJob() { return job; } public static void setJob(String job) { User.job = job; } public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } @Override public String toString() { return "User{" + "age=" + age + ", name='" + name + '\ '' + '}' ; } private void writeObject(ObjectOutputStream stream) throws IOException { System.out.println( "my writeObject" ); } private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { System.out.println( "my readObject" ); } private Object readResolve() throws ObjectStreamException { System.out.println( "my readResolve" ); return this ; } private Object writeReplace(){ System.out.println( "my writeReplace" ); return this ; } } class BUser implements Externalizable{ public BUser(){ } public BUser( int age, String name){ this .age = age; this .name = name; } transient int age; String name; static String job; public static String getJob() { return job; } public static void setJob(String job) { User.job = job; } public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } @Override public String toString() { return "User{" + "age=" + age + ", name='" + name + '\ '' + '}' ; } @Override public void writeExternal(ObjectOutput out) throws IOException { System.out.println( "my writeExternal" ); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { System.out.println( "my readExternal" ); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?