Java中的序列化和反序列化

首先我先解释下什么是序列化?什么是反序列化

Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。

提到序列化,不得不提serializable

这个接口中什么都没有,是空的,但是要想实现序列化,必须实现这个接口,只要是要想对象在网络中进行传输,必须实现这个接口

Serializable是一个标示接口,没有任何方法,表名你的类是可以序列化成字节。或保存或网络传输的

什么都不说了  直接上代码

    private static void xulie(Student stu){
         File f = new File("/Users/wangwei/abc/456.txt");// 保存两个对象的文件对象
            try {
                FileOutputStream fos = new FileOutputStream(f);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                System.out.println("没有被序列化时的对象如下:");
                
                oos.writeObject(stu);
                System.out.println("序列化成功!!");
                oos.flush();
                fos.close();
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    private static Student  fan(){
        Student stu=null;
//        /Users/zhaochang/abc/
         File f = new File("/Users/wangwei/abc/456.txt");
         try {
                FileInputStream fis = new FileInputStream(f);
                ObjectInputStream ois = new ObjectInputStream(fis);
                stu = (Student) ois.readObject();
                System.out.println(stu);  
                fis.close();
                ois.close();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        return stu;
        
    }

就是一个简单的sutdent 用于保存在那个456.txt文件中,切记,这个student是实现了那个serializable接口的,要不然不能实现序列化的

这段代码就是实现了序列化,保存在/user/wangwei/abc/456/txt中,中间用到了FileOutputstream和ObjectOutputstream,然后调用oos的write把对象放在了那个文件中了

反序列化就是从那个文件中拿到保存的对象信息,返回一个student对象,下面这个是打印结果,同鞋们可试下,验证下







内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、COSO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析模拟,揭示了生物质炉具在实际应用中的优点挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
### 序列化反序列化的基本定义 序列化是指将 Java 对象转换为可存储或传输的格式(如字节流)的过程。这一过程使得对象的状态可以被保存到文件、数据库或通过网络传输到其他系统。反序列化则是与之相对的过程,即将序列化的字节流重新转换为 Java 对象,从而恢复其原始状态结构[^1]。 ### 序列化反序列化实现方式 在 Java 中,序列化通常通过实现 `Serializable` 接口来完成,该接口是一个标记接口,没有定义任何方法,仅用于标识类的对象可以被序列化。使用 `ObjectOutputStream` 可以将对象写入输出流,从而完成序列化操作。例如: ```java try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) { oos.writeObject(new Person("Alice", 30)); } catch (IOException e) { e.printStackTrace(); } ``` 反序列化则通过 `ObjectInputStream` 实现,它从输入流中读取字节流并将其转换回 Java 对象。例如: ```java try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) { Person person = (Person) ois.readObject(); System.out.println(person); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } ``` 这两个过程都依赖于 Java对象流协议,能够自动处理对象序列化反序列化[^3]。 ### 序列化反序列化的应用场景 序列化反序列化在分布式系统中尤为重要。例如,在远程方法调用(RMI)中,对象需要在客户端服务器之间传输,这时序列化机制确保了对象能够被正确地转换为字节流并通过网络传输,接收方则通过反序列化将字节流恢复为对象。此外,序列化还常用于对象的持久化存储,如将对象保存到文件或数据库中,以便后续恢复使用。 ### 序列化反序列化的注意事项 在使用序列化反序列化时,需要注意版本控制问题。Java 提供了 `serialVersionUID` 字段用于标识类的版本,确保在反序列化时类的结构没有发生变化。如果类的结构发生了变化(如添加或删除字段),而 `serialVersionUID` 没有相应更新,反序列化可能会失败。此外,安全性也是一个重要考虑因素,因为反序列化过程中可能会执行恶意代码,因此应确保反序列化的数据来源可信[^2]。 ### 序列化反序列化的高级应用 除了 Java 原生的序列化机制外,还可以使用第三方库如 Jackson、Gson 等进行更高效的序列化反序列化操作。这些库通常支持多种数据格式(如 JSON、XML),并且提供了更高的性能灵活性。例如,使用 Jackson 进行 JSON 到 Java 对象反序列化: ```java ObjectMapper mapper = new ObjectMapper(); Person person = mapper.readValue(new File("person.json"), Person.class); System.out.println(person); ``` Jackson 提供了高度自动化的反序列化机制,能够根据目标类结构自动匹配 JSON 数据字段[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值