序列化与反序列化
当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以。 把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计 算机平台存在相应的类就可以正常恢复为原来的对象。 serialVersionUID主要是为了解决对象反序列化的兼容性问题。
如果没有提供serialVersionUID,对象序列化后存到硬盘上之后,再增加或减少类的filed。这样,当反序列化时,就会出现Exception,造成不兼容问题。
但当serialVersionUID相同时,它就会将不一样的field以type的缺省值反序列化。这样就可以避开不兼容问题了
注意:使用对象流写入到文件是不仅要保证该对象是序列化的,而且该对象的成员对象也必须是序列化的
1 public static void main(String[] args) { 2 User user = new User(12,"123"); 3 System.out.println(serize(user)); 4 System.out.println("############"); 5 System.out.println(unserize(serize(user))); 6 User result = (User)unserize(serize(user)); 7 System.out.println(result.getName()); 8 9 } 10 11 public static byte[] serize(Object obj) { 12 13 ByteArrayOutputStream bos = null; 14 ObjectOutputStream oos = null; 15 try { 16 bos = new ByteArrayOutputStream(); 17 oos = new ObjectOutputStream(bos); 18 oos.writeObject(obj); 19 return bos.toByteArray(); 20 } catch (Exception e) { 21 } 22 return null; 23 } 24 25 public static Object unserize(byte[] bytes) { 26 try { 27 ByteArrayInputStream bis = new 28 ByteArrayInputStream(bytes); 29 ObjectInputStream ois = new ObjectInputStream(bis); 30 Object result = ois.readObject(); 31 return result; 32 } catch (IOException e) { 33 e.printStackTrace(); 34 } catch (ClassNotFoundException e) { 35 e.printStackTrace(); 36 } 37 return null; 38 } 39 40 class User implements Serializable{ 41 42 private static final long serialVersionUID = 1L; 43 private int age; 44 private String name; 45 46 public User(int age, String name) { 47 this.age = age; 48 this.name = name; 49 } 50 51 public int getAge() { 52 return age; 53 } 54 55 public String getName() { 56 return name; 57 } 58 59 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?