序列化、反序列化:将对象以字节流的方式,进行写入或读取

news2024/11/25 20:38:36

序列化:将指定对象,以"字节流"的方式写入一个文件或网络中。

反序列化:从一个文件或网络中,以"字节流"的方式读取到对象。

package com.ztt.Demo01;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

public class demo16 {
	public static void main(String[] args) {
		ArrayList<String> list=new ArrayList<String>();
		list.add("张甜甜");
		list.add("张文印");
		list.add("甜甜");
		
		//序列化:将"对象"写入至文件
		try(ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\test\\tt\\list.bin"));){
			
			//将list集合对象,写入list.bin文件中
			oos.writeObject(list);
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
		
			e.printStackTrace();
		}
		
		
	}

}

输出结果:

package com.ztt.Demo01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class demo17 {
	public static void main(String[] args) {
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\test\\tt\\list.bin"))) {
            // 读取对象并尝试转换为ArrayList<String>
            ArrayList<String> list = (ArrayList<String>) in.readObject();
            System.out.println(list);
        } catch (IOException | ClassNotFoundException e) {
           
            e.printStackTrace();
        } catch (ClassCastException e) {
            
            e.printStackTrace();
        }
    }
}

输出结果:

[张甜甜, 张文印, 甜甜]
package com.ztt.Demo01;

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class demo18 {
	public static void main(String[] args) {
		Order order=new Order("SN002",1234.56,"AX59",0.5);
		
		//序列化时,该对象的类型,必须实现Serializable接口
		try(ObjectOutputStream oos=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\test\\tt\\order.ser")))){
			//写入对象
			oos.writeObject(order);
		
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
	}
}
	
	class Order implements Serializable{
	
		/*
		 * 序列化版本号
		 */
		private static final long serialVersionUID=6607463456938102524L;
		private String orderNo;//订单编号
		private double pay;//支付金额
		private double sale;//折扣
		
		//transient关键字修饰的成员变量,在序列化时,不会被写入
		private transient String validateCode;//验证码
		
		//无参构造方法
		public Order() {
			this.orderNo="SN00X";
			this.pay=0.1;
			
		}
		
		//有参构造方法
		public Order(String orderNo, double pay,String validateCode,double sale) {
		this .orderNo = orderNo ;
		this.pay = pay;
		this.validateCode=validateCode;
		this.sale=sale;
		}
		
		public Order(String orderNo) {
			this.orderNo=orderNo;
		}
		

		@Override
		public String toString() {
			return "Order [orderNo=" + orderNo + ", pay=" + pay + ", sale=" + sale + ", validateCode=" + validateCode
					+ "]";
		}

		public String getOrderNo() {
			return orderNo;
		}
		public void setOrderNo(String orderNo) {
			this.orderNo = orderNo;
		}
		public double getPay() {
			return pay;
		}
		public void setPay(double pay) {
			this.pay = pay;
		}
		
		
		
		
		
		
	}


package com.ztt.Demo01;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;


public class demo19 {
	public static void main(String[] args) {
		//反序列化:从文件中读取一个对象
		try(ObjectInputStream in =new ObjectInputStream(
				new BufferedInputStream(
						new FileInputStream("d:\\test\\tt\\order.ser")))){
			Order order =(Order)in.readObject();
			System.out.println(order);
		} catch (ClassNotFoundException| IOException e) {
			e. printStackTrace();
		}
	}
}

输出结果:

Order [orderNo=SN002, pay=1234.56, sale=0.5, validateCode=null]

注意:
需要进行序列化操作的对象,必须实现Serializable接口,使用transient关键字修饰的成员变量,在序列化时,不会被写入;在反序列化时,不会被读取。
使用场景:本地缓存,在网络环境下,将对象以流的方式,进行传输。

例如:工作列表(备忘录): 

package com.ztt.Demo01;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Scanner;

//工作列表(备忘录)
public class demo20 {
	static ArrayList<String> todoList;
	static {
		//程序启动时,从文件中,反序列化得到一个todoList集合对象
		try(ObjectInputStream in=new ObjectInputStream(new BufferedInputStream(new FileInputStream("D:\\test\\tt\\todo.bin")));){
			//读取对象
			Object data=in.readObject();
			if(data==null) {
				todoList=new ArrayList<String>();
			}else {
				todoList=(ArrayList<String>)data;
			}
		} catch (FileNotFoundException e) {
			todoList=new ArrayList<String>();
	
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		
		
		System.out.println("程序启动完毕!");
		System.out.println("当前备忘录工作列表中包含:");
		System.out.println(todoList);
		
		System.out.println("是否添加新的备忘?");
		try(Scanner input=new Scanner(System.in)){
			String line=input.nextLine();
			while(line.equalsIgnoreCase("yes")) {
				//添加一个工作备忘
				String work=input.nextLine();
				todoList.add(work);
				
				System.out.println("是否继续添加?");
				line=input.nextLine();
			}
		}
		System.out.println("添加完毕!");
		System.out.println("当前备忘录工作列表中包含:");
		System.out.println(todoList);
		
		//程序退出时,将todoList集合对象,序列化至文件
		try(ObjectOutputStream out=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\test\\tt\\todo.bin")));){
			
			out.writeObject(todoList);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			
		
	}

}

package com.ztt.Demo01;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;


public class demo19 {
	public static void main(String[] args) {
		//反序列化:从文件中读取一个对象
		try(ObjectInputStream in =new ObjectInputStream(
				new BufferedInputStream(
						new FileInputStream("d:\\test\\tt\\order.ser")))){
			Order order =(Order)in.readObject();
			System.out.println(order);
		} catch (ClassNotFoundException| IOException e) {
			e. printStackTrace();
		}
	}
}

输出结果: 

程序启动完毕!
当前备忘录工作列表中包含:
[AAA, BBB]
是否添加新的备忘?
yes
CCC
是否继续添加?
no
添加完毕!
当前备忘录工作列表中包含:
[AAA, BBB, CCC]

Properties

  • *.properties格式的文件,内容是Key-Value键值对格式(key=value)
  • 注释使用#
  • 使用Properties类完成*properties格式文件的读取和写入,读取使用 load(),写入使用store()
  • Properties类本质其实是一个Map集合,是Hashtable类的子类。

 

package com.ztt.Demo01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
//properties 类型的文件: key-value键值对文件
//读取

public class demo21 {
	public static void main(String[] args) {
		try(FileInputStream fis=new FileInputStream("D:\\test\\tt\\config.properties")){
		//创建Properties类型的对象props,用于读取* .properties类型的文件

		Properties props=new Properties();
		//读取
		props.load(fis);
		
		//根据key获取value
		System.out.println(props.get("029"));
		
		System.out.println(props);
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

}

输出结果:

西安
{2448=杭州, 029=西安, 020=上海}
package com.ztt.Demo01;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class demo22 {
	public static void main(String[] args) {
		//读取classpath路径下的*.properties文件
		//当前类所在的位置: Demo22. class . getResourceAsstream( " config. properties" )
		//当前ClassPath 下的指定位置: Demo22. class. getResourceAsstream( "/com/ .. ./config . properties'

		try(InputStream in=demo22.class.getResourceAsStream("/com/ztt/Demo01/config.properties")){
			Properties props=new Properties();
			props.load(in);
			System.out.println(props);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

输出结果:

{2448=杭州, 025=成都, 029=西安, 020=上海, 010=北京}
package com.ztt.Demo01;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

//properties文件的写入操作
public class demo23 {
	public static void main(String[] args) {
		Properties props=new Properties();
		props.put("version", "v0.0001");
		props.put("active-code", "asdfghjklzxcvbnmqwertyuiop");
		
		try(FileOutputStream fos=new FileOutputStream("D:\\test\\tt\\app.properties")){
			//将键值对,通过输出流写入指定文件,并添加注释
			props.store(fos, "My application basic properties data.");

		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

}

输出结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1582771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++的stack和queue类(一):适配器模式、双端队列与优先级队列

目录 基本概念 适配器模式 stack.h test.cpp 双端队列-deque 仿函数 优先级队列 基本概念 1、stack和queue不是容器是容器适配器&#xff0c;它们没有迭代器 2、stack的quque的默认容器是deque&#xff0c;因为&#xff1a; stack和queue不需要遍历&#xff0…

基于SSM+Jsp+Mysql的农产品供销服务系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

0基础想进入IT行业,可以从这个框架入手

行业现状 IT、AI都是很多年来的热门话题&#xff0c;以至于时至今日&#xff0c;哪怕IT行业已经卷成狗&#xff0c;依然有无数的人想要挤进这个行业。 大模型、云原生、react等等&#xff0c;无数的技术、概念应运而生。那么作为一个没有基础的人&#xff0c;该如何进入这个行…

第十四届蓝桥杯模拟考试II_物联网设计

还是要稳妥啊&#xff0c;写A板的时候感觉很简单所以将模块都混在一起了&#xff0c;结果不出意外就出BUG了又得从头开始查BUG,多简单的题模块最好都分块写写完就检查&#xff0c;这样一步一个脚印多稳 这个模块出了俩BUG第一个是要检查有没有数据进入if语句&#xff0c;不然标…

Kubernetes(k8s)监控与报警(qq邮箱+钉钉):Prometheus + Grafana + Alertmanager(超详细)

Kubernetes&#xff08;k8s&#xff09;监控与报警&#xff08;qq邮箱钉钉&#xff09;&#xff1a;Prometheus Grafana Alertmanager&#xff08;超详细&#xff09; 1、部署环境2、基本概念简介2.1、Prometheus简介2.2、Grafana简介2.3、Alertmanager简介2.4、Prometheus …

OpenCV | 图像读取与显示

OpenCV 对图像进行处理时&#xff0c;常用API如下&#xff1a; API描述cv.imread根据给定的磁盘路径加载对应的图像&#xff0c;默认使用BGR方式加载cv.imshow展示图像cv.imwrite将图像保存到磁盘中cv.waitKey暂停一段时间&#xff0c;接受键盘输出后&#xff0c;继续执行程序…

力扣面试150 分发糖果 分步贪心

Problem: 135. 分发糖果 思路 &#x1f468;‍&#x1f3eb; 参考&#xff1a;代码随想录 一次是从左到右遍历&#xff0c;只比较右边孩子评分比左边大的情况。一次是从右到左遍历&#xff0c;只比较左边孩子评分比右边大的情况。 复杂度 时间复杂度: O ( n ) O(n) O(n) …

代码随想录算法训练营第三十六天| LeetCode 435. 无重叠区间、763.划分字母区间、56. 合并区间

一、LeetCode 435. 无重叠区间 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html 状态&#xff1a;已解决 1.思路 本题的局部最优是尽量移除与某个区间重叠的其他区间&#xff0c;全局最优是移除的…

构建强健身体的未来:健身管理平台微服务架构解析

在现代社会&#xff0c;人们越来越关注健康和身体素质的提升。健身管理平台应运而生&#xff0c;为用户提供个性化的健身计划、监测和管理工具。微服务架构作为一种灵活且可扩展的系统设计方法&#xff0c;为健身管理平台提供了高效、可靠的基础。 1. 概述健身管理平台微服务架…

Open CASCADE学习|统计形状拓扑数量

边界表示法&#xff08;Boundary Representation&#xff0c;简称B-Rep&#xff09;是几何造型中最成熟、无二义的表示法。它主要用于描述物体的几何信息和拓扑信息。在边界表示法中&#xff0c;一个实体&#xff08;Solid&#xff09;由一组封闭的面&#xff08;Face&#xff…

创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现

本文介绍基于C语言GDAL库&#xff0c;批量创建大量栅格遥感影像文件&#xff0c;并将数据批量写入其中的方法。 首先&#xff0c;我们来明确一下本文所需实现的需求。已知我们对大量遥感影像进行了批量读取与数据处理操作——具体过程可以参考文章C GDAL提取多时相遥感影像中像…

nginx工作原理解析

目录 1、master-workers 的工作机制介绍 2、master-workers 的机制的好处 3、设置多少个 worker 4、最大连接数和支持的最大并发数的计算 1、master-workers 的工作机制介绍 nginx在启动后&#xff0c;会有一个master进程和一个或者多个相互独立的worker进程 过来的请求由…

HDLbits 刷题 --Exams/m2014 q4h

Implement the following circuit: 实现以下电路&#xff1a; module top_module (input in,output out);assign out in; endmodule 运行结果&#xff1a;

Spark_SparkSql写入Oracle_Undefined function.....将长字符串写入Oracle中方法..

在使用Spark编写代码将读库处理然后写入Oracle中遇到了诸多小bug,很磨人。shit!! 实测1&#xff1a;TO_CLOB(a3) 代码样例 --这是一个sparksql写入hive的一个小逻辑&#xff0c;我脱敏了噻 SELECT a1, a2, TO_CLOB(a3) AS clob_data, TO_DATE(a4) AS time FROM table1 WHERE…

关于Linux下的进程等待(进程篇)

目录 为什么存在进程等待&#xff1f;进程等待是在做什么&#xff1f; 怎样去执行进程等待&#xff1f; status options 为什么存在进程等待&#xff1f;进程等待是在做什么&#xff1f; 代码示例&#xff1a;模仿僵尸进程 #include <stdio.h> #include <unistd.…

3D-Aware Multi-Class Image-to-Image Translation with NeRFs

3D-Aware Multi-Class Image-to-Image Translation with NeRFs 利用NeRFs实现3D感知的多类图像到图像的翻译 Senmao Li1  Joost van de Weijer2  Yaxing Wang1 李森茂 1 范德维杰 2 王亚兴 1  Fahad Shahbaz Khan3,4  Meiqin Liu5  Jian Yang1 法哈德夏巴兹汗 3,4 刘梅琴 …

DSP笔记13-时间基准子模块Time base(TB)比较子模块Counter cpmpare(CC)

时间基准子模块Time base(TB) 同步&#xff0c;计数 CTR计数寄存器 PRD周期寄存器 CMP比较寄存器&#xff0c;占空比 EPWMA&#xff0c; EPWMB&#xff0c;两个比较寄存器&#xff0c;但只有以及计数寄存器以及一个周期寄存器 计数模式 计数时钟TBCLK HSPCLKDIVx x0,分…

存算架构优化:为大模型算力提升铺平道路

随着人工智能技术的飞速发展&#xff0c;大模型已经成为了推动各行各业进步的关键力量。从自然语言处理到图像识别&#xff0c;再到复杂的数据分析&#xff0c;大模型以其卓越的性能和广泛的应用前景&#xff0c;正逐渐成为AI领域的焦点。然而&#xff0c;大模型的高效运行离不…

Day 2. 2440相关知识点

1、arm的工作模式有哪些&#xff1f; ARM的工作模式分为普通模式、特权模式&#xff0c;其中特权模式又细分为六种模式 普通模式用户模式&#xff08;User&#xff09;大部分任务执行在这种模式 特权模式快速中断模式FIQ当一个高优先级&#xff08;fast) 中断产生时将会进入…

传输层协议——UDP/TCP协议

目录 端口号 端口号范围 pidof UDP协议 UDP协议格式 UDP特点 UDP缓冲区 UDP的注意事项 基于UDP的应用层协议 TCP协议 TCP协议格式 序号与确认序号 窗口大小 6个标记位 紧急指针 确认应答机制 连接管理机制 三次握手 四次挥手 超时重传机制 流量控制 滑动…