提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|行业资讯|编辑:龚雪|2016-06-08 18:03:08.000|阅读 140 次
概述:java序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节序列恢复为java对象的过程。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
在说java序列化的作用之前,先说下什么是java序列化吧。java序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节序列恢复为java对象的过程。java序列化主要有两个作用:
对象A1序列化成字节序列A的过程,是把一个存在于内存中的对象转化为一个可以被持久化和网络传输的字节序列的过程,字节序列A反序列化成A2就是逆过程。注意:A1和A2的关系,应该是equals,而不是==(如果包含transient属性或者自定义了序列化和反序列化方法,可能equals都不是)。
用户信息类:
package com.podongfeng; import java.io.Serializable; /** * Title: User.class<br> * Description: 用户信息类<br> * Create DateTime: 2016年04月18日 下午10:20 <br> * * @author podongfeng */ public class User implements Serializable { private static final long serialVersionUID = 9058870178716533905L; public static String TAG = "java"; private String name; private int age; transient private int salary; public User(String name, int age, int salary) { this.name = name; this.salary = salary; this.age = age; } 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; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", salary=" + salary + '}'; } }
序列化和反序列化测试类:
package com.podongfeng; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * Title: SerializableTest.class<br> * Description: 序列化和反序列化测试<br> * Create DateTime: 2016年04月18日 下午10:33 <br> * * @author podongfeng */ public class SerializableTest { public static void main(String[] args) { User user = new User("jack", 20, 10000); System.out.println(user); // 序列化 ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("jack.txt")); oos.writeObject(user); } catch (Exception e) { e.printStackTrace(); } finally { if (oos != null) { try { oos.flush(); oos.close(); } catch (IOException e) { e.printStackTrace(); } } } // 反序列化 ObjectInputStream ois = null; User user2 = null; try { ois = new ObjectInputStream(new FileInputStream("jack.txt")); user2 = (User)ois.readObject(); System.out.println(user2); } catch (Exception e) { e.printStackTrace(); } finally { if (ois != null) { try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("user equals user2 : " + user.equals(user2)); System.out.println("user == user2 : " + (user == user2)); } }
运行结果:
User{name='jack', age=20, salary=10000} User{name='jack', age=20, salary=0} user equals user2 : false user == user2 : false
Serializable接口是在java序列化中最常用的。一个实体类想要被序列化,只要实现Serializable接口即可,而且并不需要实现任何方法,实现这个接口更像是一种象征性的声明。其实也并不完全是这样,当你的实体类实现这个接口的时候,你的IDE(eclipse或者idea)应该会给你一个警告,提示你serialVersionUID这个成员变量,接下来我们就来说说它的作用。serialVersionUID可以理解为类的版本号,只有版本号相同,反序列化才能成功。serialVersionUID可以不显式设置,那么就会有一个默认的serialVersionUID,这个是通过你的类定义信息计算所得,也就是说,如果这个类进行了修改,就会产生一个不同的serialVersionUID,那么之前序列化的字节流就不能正常反序列化了。但是,在某些情况下,我们对实体类进行了修改,比如增加了一个成员变量,但我还是希望可以反序列成功,其实就可以通过显示定义一个serialVersionUID,只要增加成员变量的时候没有修改serialVersionUID,那么之前序列化好的字节流可以被反序列化成新的对象。
实际的开发过程中,可能会有这样的需求,一个实体类中,某些属性需要序列化,某些属性不需要,如果能自己控制,可以有效减少系列化的长度,提高序列化和反序列话的效率。比较便捷的方式是通过transient关键字,声明为transient的成员变量不会被序列化。正如上面样例代码中输出的结果,salary字段被定义为transient,在user对象中有值为10000,但是序列化反序列化后user2对象中salary为0,即int类型的初始值。如果觉得这还不够,需要进一步自定义,那么可以考虑覆写writeObject(ObjectOutput out)和readObject(ObjectInput in)方法,如果你的实体类实现了Serializable接口并且覆写了这2个方法,jvm就会调用这2个方法进行序列化和反序列化了,你可以完全控制需要序列化的属性和过程了。
除了Serializable接口,想要序列化的类还可以选择实现Externalizable接口,与writeObject(ObjectOutput out)和readObject(ObjectInput in)方法对应,有这样2个方法:writeExternal(ObjectOutput out)和readExternal(ObjectInput in)。不同的是,在反序列的过程中,还是调用序列化的类的无参构造方法,而实现Serializable接口并不会。
本文来源:简书
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
通过提供强大的3D CAD数据访问工具并适用于桌面、移动和Web的高级环境3D可视化发动机,HOOPS在提升造船设计和制造流程的效率方面发挥了重要作用。
HOOPS Luminate在汽车行业中的应用具有广泛的潜力和深远的影响。它通过提供高效的3D可视化、虚拟装配与拆解、性能分析、客户定制等功能,帮助汽车制造商在设计、生产和销售过程中提升效率、降低成本并提高产品质量。
在不断发展的软件开发世界中,使工具和框架与最新的平台版本保持同步至关重要,欢迎查阅~
全球航运业对国际贸易至关重要,全球 90% 以上的商品通过海运运输。准确监控和控制这些集装箱的移动对于维持高效的供应链至关重要。手动输入集装箱号码是这一程序的关键部分,它带来了相当大的挑战,例如人为错误和效率低下。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢