泛型,序列化

2023-11-17

何为泛型?
1.JDK1.5以后推出的一种新的参数化的类型。
2.通常可以理解为一种一种编译类型,在运行时无效。
3.类型生活中的标签

**为什么使用泛型?**
1.约束类中属性类型,方法参数类型,方法返回值类型
2.提高运行时性能 List s = new ArrayList(); s.add(100); Integer 0 = (Integer)s.get(0);

**泛型常用的方式分析?**
1.泛类型:类名<泛型>  class PageObject<T>{}
2.泛型方法:<泛型>方法返回值类型
3.泛型接口:interface 接口名<泛型>{}

**泛型的通配符?**(这里的通配符可以看成一种不确定的值)
1.泛型应用是有一个特殊符号“?”,可以代表任意参数类型,注释是实参。
2.通配符单行只能应用于变量的定义

**泛型上下界问题?**
1.指定泛型下界:<? super 类型>
2.指定泛型上界:<? extends类型> 例如: List<? Extends CharSequence> list1= new ArrayList<String >(); List<? super Intenger> list2 = new
ArrayList<Number>(); 说明: 这种上下界一般会用于方法参数变量定义,方法返回值类型定义。

**如何理解泛型类型擦除?**
1.泛型是编译时的一种类型,在运行时无效,运行时候都会变成Object类型。 
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Test {
	public static void main(String[] args) throws Exception {
		List<String>list = new ArrayList<>();
		list.add("100");
		list.add("200");
		//list.add("300");
		//利用反射机制将300存入list集合
		//1.获取类型对象
		Class<?> c = list.getClass();
		//2.获取类中add方法对象
		Method m = c.getDeclaredMethod("add", Object.class);
		//3.执行方法对象,执行list对象的add方法,将300存入
		m.invoke(list, 300);
		System.out.println(list);
	}
}

何为序列化&反序列化
1.序列化:将对象转换为字节的过程。
2.反序列化:将字节转换为对象的过程。

序列化的应用场景?
1.网络通讯
2.数据存储(例如文件,缓存)

Java中对象的序列化与反序列化?
1.对象要实现Serializable接口。
2.添加序列化id(为反序列化提供保障)。
3.借助流对象实现序列化与反序列化。

import java.io.File;
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.io.Serializable;

class SysLog implements Serializable{
	private static final long serialVersionUID = -6695311142916641655L;
	private Integer id;
    private transient Integer time;
    
	public Integer getTime() {
		return time;
	}
	public void setTime(Integer time) {
		this.time = time;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	//序列化定义的一种规范方法:用于对象序列化
	private void writeObject(ObjectOutputStream out)
	throws IOException{
		System.out.println("==writeObject==");
		//对数据加密
		id=id+1;
		//对对象执行序列化
		out.defaultWriteObject();
	}
	//序列化定义的一种规范方法:用于对象反序列化
	private void readObject(ObjectInputStream in)
	throws IOException,ClassNotFoundException{
		System.out.println("==readObject==");
		//执行反序列化
		in.defaultReadObject();
		//执行解密操作
		id=id-1;
	}
	

}
public class TestSerializable01 {
	public static void main(String[] args)throws Exception {
	//1.构建一个文件对象?
	File file=new File("data.dat");
	//2.将日志对象序列化到文件
	doMethod01(file);
	//3.从文件中读取对象
	doMethod02(file);
	}
	public static void doMethod02(File file)throws Exception{
		//1.构建流对象,读取文件
		ObjectInputStream in=
		new ObjectInputStream(new FileInputStream(file));
		//2.读取对象
		SysLog log=(SysLog)in.readObject();
		System.out.println(log.getId());
		System.out.println(log.getTime());
		//3.释放资源
		in.close();
	}
    //序列化//提取方法 alt+shift+m
	private static void doMethod01(File file) throws IOException, FileNotFoundException {
		//2.1 构建日志对象
		SysLog log=new SysLog();
		log.setId(100);
		log.setTime(1000);
		//2.2 构建对象流对象
		ObjectOutputStream out=
		new ObjectOutputStream(new FileOutputStream(file));
		//2.3执行对象的序列化
		out.writeObject(log);
		//2.4.释放资源	
		out.close();
		System.out.println("序列化ok");
	}
}

Java中序列化存在安全性问题吗? 如何解决:
1.添加writeObject(ObjectOutpuStream out)方法,对内容进行加密在执行序列化
2.添加readObject(ObjectIntpuStream in)方法,对内容进行反序列化然后在执行解密操作


/*//序列化定义的一种规范方法:用于对象序列化
    	private void writeObject(ObjectOutputStream out)
    	throws IOException{
    		System.out.println("==writeObject==");
    		//对数据加密
    		id=id+1;
    		//对对象执行序列化
    		out.defaultWriteObject();
    	}
    	//序列化定义的一种规范方法:用于对象反序列化
    	private void readObject(ObjectInputStream in)
    	throws IOException,ClassNotFoundException{
    		System.out.println("==readObject==");
    		//执行反序列化
    		in.defaultReadObject();
    		//执行解密操作
    		id=id-1;
    	}*/

Java中序列化的粒度如何控制?``
1.Transient(当少量属性不需要序列化是,使用此关键字)
2.Externalizable(当只有少量属性需要序列化时实现此接口操作,但是要序列化的对象必须是public修饰)

      
         @Override
        	public void writeExternal(ObjectOutput out) throws IOException {
        		out.writeInt(id);
        	}
        	//将需要反序列化的内容在此方法执行反序列化
        	@Override
        	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        		id=in.readInt();
        	}

写的有点粗糙,不足的地方希望大家指出。
谢谢!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

泛型,序列化 的相关文章

随机推荐

  • 谷歌浏览器Google Chrome离线版(持续更新中)

    谷歌浏览器官方正式版采用自主研发Chromium内核 它是全球受欢迎的谷歌浏览器电脑版 追求速度 隐私安全的网络浏览器 而Google Chrome浏览器离线版更可以在无网络的情况下安装 一 在线版和离线版区别 在线版 即下载官方下载的一个
  • 服务链路追踪(Spring Cloud Sleuth)

    sleuth 英 slu 美 slu n 足迹 警犬 侦探vi 做侦探 微服务架构是一个分布式架构 它按业务划分服务单元 一个分布式系统往往有很多个服务单元 由于服务单元数量众多 业务的复杂性 如果出现了错误和异常 很难去定位 主要体现在
  • java中使用spark如何将column多列合为一列

    接下来介绍几种使用spark将DataFrame中一行的多列合并到一列中 并且该列以不同的类型展示保存 1 建立dataset 自己需要连接的mongo库 private static String datasource 自己需要连接的mo
  • 第十课.图片风格迁移和GAN

    目录 Neural Style Transfer Neural Style Transfer原理 准备工作 定义模型并加载预训练的模型参数 训练target以及结果可视化 生成对抗网络GAN GAN原理 GAN生成Mnist 准备工作 模型
  • 博客系统文章的数据库存储方式

    在通常的博客系统中 我们发表文章的时候 在数据库中存储的一般不仅仅是文章的文字 还包括文章的样式 而且很多时候都是所见即所得的效果 这就要求我们以html 文字这样存进数据库中 通过查找资料 可以用专门的文字编辑器可以实现 使用方法如下 F
  • 系统架构设计师之网络安全-各个层次的网络安全保障

    系统架构设计师之网络安全 各个层次的网络安全保障
  • Map集合知识点整理

    目录 一 Map集合概述 1 特点 2 Map集合的基本功能 二 实现类HashMap集合 1 概述 2 常用方法总结 3 HashMap的底层实现 4 LinkedHashMap 5 TreeMap 三 Map集合的遍历方式 四 案例演示
  • 文献管理软件--zotero基本使用

    文章目录 一 下载与安装 1 下载插件 以火狐浏览器为例 2 注册账户 3 下载桌面版 二 文献导入 1 新建文件 2 导入文献 3 本地导入 4 支持批量下载 三 文献管理 1 添加标签 2 添加子目录 3 添加笔记 四 添加插件 五 数
  • MyBatis的逆向工程

    MyBatis的逆向工程 正向工程 先创建Java实体类 由框架负责根据实体类生成数据库表 Hibernate是支持正向工程的 逆向工程 先创建数据库表 由框架负责根据数据库表 反向生成如下资源 Java实体类 Mapper接口 Mappe
  • 迭代法求解线性方程组(C++实现)

    本系列是数值分析相关算法的文章 这次用迭代法求解线性方程组 不同于上次用高斯消元法之类的求解 迭代法对于稀疏矩阵方程组的运算 会大大提高 而如果用高斯相关的算法求解 会浪费大量资源计算无用的东西 所以有必要研究此算法 本文章主要使用了3个算
  • android之service

    Service的启动有两种方式 context startService 和 context bindService 通过startService 启动的服务处于 启动的 状态 一旦启动 service就在后台运行 即使启动它的应用组件已经
  • Matlab2023a最新详解

    MATLAB 2023版的深度学习工具箱 提供了完整的工具链 使您能够在一个集成的环境中进行深度学习的建模 训练和部署 与Python相比 MATLAB的语法简洁 易于上手 无需繁琐的配置和安装 让您能够更快地实现深度学习的任务 MATLA
  • 【CTF/MISC】图片隐写题(binwalk/foremost/010editer配合使用)

    图片隐写 题目 解题思路 binwalk工具查看是否有隐藏文件 foremost工具分离文件 010editer查看二进制数据 寻找解压密码 解题心得 题目连接 题目 题目是一张图片 寻找题目中隐藏的flag 解题思路 一般来说我碰到图片隐
  • SSM框架下实现简单增删查改的具体细节(代码)

    UserInfo public class UserInfo private int id private String username private String password public int getId return id
  • 电子检测报告如何盖骑缝章?

    检测评估报告通常有多页 几十页的报告也不少见 文件中除了要在检测机构盖公章处盖章 还需要盖骑缝章 为了防范风险 防止报告内容被更换的情况 就需要骑缝章的加盖来保证检测报告的整体性 下面以微签为例 展示一下电子检测报告如何盖骑缝章 微签在检测
  • Java线程池面试题整理总结【实习打卡01】

    ThreadLocal GC 之后 key 是否为 null 不一定 1 当使用new ThreadLocal lt gt set s 定义threadlocal时 没有在栈中声明一个变量指向他 那他就是只被弱引用 在gc后 那这个thre
  • 获取微信小程序码实例,建议拿到字节流后可以base64编码再上传图片,得到图片地址进行使用

    接口调用凭证 access token public static String postToken String appId String appKey throws Exception String requestUrl https a
  • 【无人车】用于无人地面车辆的路径跟踪算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 无人驾驶技术是当前社会的热门技术之一 无人
  • 【Unity&UGUI&Shader】创建材质球Material&代码控制更换物体材质球

    UGUI Unity Graphical User Interface 简称 UGUI 又称图形用户接口 如何创建材质球 NGUI Next generation GUI 下一代图形用户接口 Assets Create Material如下
  • 泛型,序列化

    何为泛型 1 JDK1 5以后推出的一种新的参数化的类型 2 通常可以理解为一种一种编译类型 在运行时无效 3 类型生活中的标签 为什么使用泛型 1 约束类中属性类型 方法参数类型 方法返回值类型 2 提高运行时性能 List s new