JAXB 使用记录 bean转xml xml转bean 数组 继承 CDATA(转义问题)
JAXB 使用记录
部分内容引自
https://blog.csdn.net/gengzhy/article/details/127564536
基础介绍
JAXBContext类:是应用的入口,用于管理XML/Java绑定信息
Marshaller接口:将Java对象序列化为XML数据
Unmarshaller接口:将XML数据反序列化为Java对象
@XmlRootElement:将Java类或枚举类型映射到XML元素,用在Java类上,用于标注该类是xml的一个根节点
@XmlElement:将Java类的一个属性映射到与属性同名的一个XML元素。通常与@XmlTransient搭配使用。
@XmlTransient:通常与 @XmlElement 须搭配使用的。@XmlElement用在属性上,用于指定生成xml的节点名,@XmlTransient用在对应的getter方法上,起到关联的作用
@XmlElementWrapper :对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。通常配合XmlElement一起使用,XmlElementWrapper指定数组名,XmlElement指定生成xml的节点名
@XmlElementRef:用在类属性的getter方法上(即该属性是一个JavaBean),并且该属性是某些子类的父类,起到引用的作用。同时标注得有@XmlElementRef的类属性,其子类上需要使用@XmlRootElement标注,否则转换异常,提示找不到具体的引用实现。另外,转换时,需要将其子类的class一起传递到JAXBContext上下文中,否则也无法转换
@XmlAccessorOrder:控制JAXB 绑定类中属性和字段的排序
@XmlType:将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) :控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML。还有XmlAccessType.PROPERTY和XmlAccessType.NONE
@XmlJavaTypeAdapter:使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML
@XmlAttribute:将Java类的一个属性映射到与属性同名的一个XML属性
工具类
package xmlAndBean;import lombok.extern.slf4j.Slf4j;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Source;
import javax.xml.transform.sax.SAXSource;
import java.io.StringReader;
import java.io.StringWriter;/*** @version : 1.0* @Description : xml工具类* @Date: 2023/10/9 9:03**/public class XmlBeanUtils {/*** 构造方法私有**/private XmlBeanUtils() {}public static final String ENCODING_UTF = "UTF-8";public static final String ENCODING_GB = "GB18030";/*** @return java.lang.String* @Description : bean转xml不含报文头(GB18030编码格式)* @Param [obj]* @Param encoding 编码格式**/public static String beanToXml(Object obj,String encoding) {String result = null;try {JAXBContext context = JAXBContext.newInstance(obj.getClass());Marshaller marshaller = context.createMarshaller();// Marshaller.JAXB_FORMATTED_OUTPUT 决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml)marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);// Marshaller.JAXB_ encoding xml的编码方式marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);// 去掉生成xml的默认报文头marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);StringWriter writer = new StringWriter();marshaller.marshal(obj, writer);result = writer.toString();} catch (Exception e) {
// log.error("bean转xml报文失败", e);}return result;}/*** @return java.lang.String* 报文格式:* <?xml version="1.0" encoding="GB18030"?>* <ROOT>* <HEAD>* …* </HEAD>* <DATA>* <title1 >…</title1>* <title2 >…</title2>* …* </DATA>* </ROOT>* @Description : 组装报文* @Param [xmlHead, xmlData]**/public static String indentFormat(String xmlHead, String xmlData) {try {String xmlHeader = "<?xml version=\"1.0\" encoding=\"GB18030\"?>\n";StringBuilder xml = new StringBuilder();xml.append(xmlHeader).append("<ROOT>\n").append(xmlHead).append(xmlData).append("\n</ROOT>");return xml.toString();} catch (Exception e) {
// log.error("组装xml报文失败", e);return null;}}/*** xml转对象** @param xml* @param msgVo* @param <T>* @return*/public static <T> T xmlToBean(String xml, Class<T> msgVo) {if (msgVo == null) {return null;}try {JAXBContext context = JAXBContext.newInstance(msgVo);Unmarshaller unmarshaller = context.createUnmarshaller();Source source = trunSource(xml);return (T) unmarshaller.unmarshal(source);} catch (Exception e) {
// log.error("xml转对象异常:", e);}return null;}/*** 忽略xml命名空间** @param xmlStr* @return* @throws SAXException* @throws ParserConfigurationException*/private static Source trunSource(String xmlStr) throws SAXException, ParserConfigurationException {StringReader reader = new StringReader(xmlStr);SAXParserFactory sax = SAXParserFactory.newInstance();sax.setNamespaceAware(false);XMLReader xmlReader = sax.newSAXParser().getXMLReader();return new SAXSource(xmlReader, new InputSource(reader));}/*** Java Bean 转 Xml** @param bean - Java Bean* @param inheritClazz - Java Bean中嵌套的类,且有继承关系的Java Class* @return - xml*/public static String beanToXml(Object bean, String encoding,Class<?>... inheritClazz) {try {JAXBContext context = initContext(bean.getClass(), inheritClazz);Marshaller marshaller = context.createMarshaller();// 格式化xmlmarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// Marshaller.JAXB_ encoding xml的编码方式marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);// 去掉生成xml的默认报文头marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);StringWriter writer = new StringWriter();marshaller.marshal(bean, writer);return writer.toString();} catch (JAXBException e) {e.printStackTrace();}return null;}/*** Xml 转 Java Bean** @param xml - xml* @param beanClazz - Java Bean Class* @param inheritClazz - Java Bean中嵌套的类,且有继承关系的Java Class* @return - bean*/public static Object xmlToBean(String xml, Class<?> beanClazz, Class<?>... inheritClazz) {try {JAXBContext context = initContext(beanClazz, inheritClazz);Unmarshaller um = context.createUnmarshaller();StringReader sr = new StringReader(xml);return um.unmarshal(sr);} catch (JAXBException e) {e.printStackTrace();}return null;}/*** 初始化JAXBContext** @param mainClazz - 序列化或反序列化Class* @param inheritClazz - Java Bean中嵌套的类,且有继承关系的Java Class* @return - JAXBContext*/private static JAXBContext initContext(Class<?> mainClazz, Class<?>... inheritClazz) throws JAXBException {JAXBContext context;if (inheritClazz != null) {Class<?>[] clazzArr = new Class[inheritClazz.length + 1];clazzArr[0] = mainClazz;System.arraycopy(inheritClazz, 0, clazzArr, 1, clazzArr.length - 1);context = JAXBContext.newInstance(clazzArr);} else {context = JAXBContext.newInstance(mainClazz);}return context;}}
xml结构
结构如下:
<ROOT>
<HEAD>…
</HEAD>
<DATA><title1 >…</title1><title2 >…</title2>…<RECORD><LIST1 p_type="G"><title1 >…</title1></LIST1><LIST1 p_type="G"><title1 >…</title1></LIST1></RECORD>
</DATA>
</ROOT>
①存在继承关系的bean转xml
基类:用于统一,方便向下转型
/*** @version : 1.0* @Description : 基类* @Date: 2023/10/9 19:55**/
public class BaseDTO {
}
DATA标签实体类同时继承基类
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.List;/*** @version : 1.0* @Description :* @Date: 2023/10/9 19:55**/
@Setter
@Getter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "DATA")
public class BookDTO extends BaseDTO{@XmlElement(name = "name")@XmlJavaTypeAdapter(CdataXmlAdapter.class)private String bookName;@XmlElement(name = "id")private String bookId;//@XmlElementWrapper(name = "RECORD")
// @XmlElement(name = "LIST1")
// private List<DescDTO> descDTOList;
}
HEAD标签实体类
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;/*** @version : 1.0* @Description :* @Date: 2023/10/9 19:58**/
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "HEAD")
public class HeadDTO {@XmlElement(name = "SEND_NODE")private String send;@XmlElement(name = "RECV_NODE")private String receive;
}
根标签实体类
其中针对DATA标签,每个接口的DATA标签可能都不相同,这里使用了@XmlElementRef标签结合基类(BaseDTO ),在使用中将接口的实体类继承BaseDTO基类,并标注@XmlRootElement(name = “DATA”),即可实现每个接口拥有独立的对象实现bean转xml
import lombok.*;import javax.xml.bind.annotation.*;/*** @version : 1.0* @Description :* @Date: 2023/10/9 19:55**/
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
//@XmlType(propOrder = { "head", "data" }) 这句加不加无所谓
@XmlRootElement(name = "ROOT")
public class RootDTO {@XmlElement(name = "HEAD")private HeadDTO head;//@XmlElement(name = "DATA")//@XmlElementRef 注解要加载对象上不能加在get方法上,不然报错如下//com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 5 counts of IllegalAnnotationExceptions类的两个属性具有相同名称 "head"@XmlElementRef(name = "DATA")private BaseDTO data;}
测试类
public class XmlTest {public static void main(String[] args) {//继承基类BookDTO bookDTO = new BookDTO();bookDTO.setBookName("name");bookDTO.setBookId("id");//HEAD标签实体类,一般内容固定HeadDTO headDTO = new HeadDTO();headDTO.setSend("send");headDTO.setReceive("rece");RootDTO rootDTO = new RootDTO();rootDTO.setHead(headDTO);//因为BookDTO 继承基类所以此处能设置成功rootDTO.setData(bookDTO);//bean转xml,需要将BookDTO.class(子类)传入以告知System.out.println(XmlBeanUtils.beanToXml(rootDTO,XmlBeanUtils.ENCODING_GB,BookDTO.class));//xml转beanSystem.out.println(XmlBeanUtils.xmlToBean(xml, RootDTO.class,BookDTO.class));}
}
运行结果:

②存在数组的bean转xml
DATA标签实体类同时继承基类
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.List;/*** @version : 1.0* @Description :* @Date: 2023/10/9 19:55**/
@Setter
@Getter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "DATA")
public class BookDTO extends BaseDTO{@XmlElement(name = "name")@XmlJavaTypeAdapter(CdataXmlAdapter.class)private String bookName;@XmlElement(name = "id")private String bookId;//@XmlElementWrapper(name = "RECORD")@XmlElement(name = "LIST1")private List<DescDTO> descDTOList;
}
数组实体类对象
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;import javax.xml.bind.annotation.*;/*** @version : 1.0* @Description :* @Date: 2023/10/10 10:25**/
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "LIST1")
public class DescDTO{@XmlAttribute(name = "p_type")private String pType;@XmlElement(name = "description")private String description;
}
假设在DATA标签实体类中存在数组属性,则使用@XmlElement(name = “LIST1”)进行标注,即可实现每个数组对象转换成xml时都被<LIST1> </LIST1>包裹
测试类
public class XmlTest {public static void main(String[] args) {BookDTO bookDTO = new BookDTO();bookDTO.setBookName("name");bookDTO.setBookId("id");HeadDTO headDTO = new HeadDTO();headDTO.setSend("send");headDTO.setReceive("rece");RootDTO rootDTO = new RootDTO();rootDTO.setHead(headDTO);rootDTO.setData(bookDTO);DescDTO descDTO = new DescDTO();//descDTO.setPType("G");descDTO.setDescription("desc11111");DescDTO descDTO1 = new DescDTO();//descDTO1.setPType("G");descDTO1.setDescription("desc22222");ArrayList<DescDTO> descDTOS = new ArrayList<>();descDTOS.add(descDTO);descDTOS.add(descDTO1);bookDTO.setDescDTOList(descDTOS);String xml = XmlBeanUtils.beanToXml(rootDTO, XmlBeanUtils.ENCODING_GB, BookDTO.class);//bean转xmlSystem.out.println(XmlBeanUtils.beanToXml(rootDTO,XmlBeanUtils.ENCODING_GB,BookDTO.class));//xml转beanSystem.out.println(XmlBeanUtils.xmlToBean(xml, RootDTO.class,BookDTO.class));}
}
运行结果

如果需要再在数组外面套一层标签则:
@XmlElementWrapper(name = "RECORD")@XmlElement(name = "LIST1")private List<DescDTO> descDTOList;
运行结果:

③存在数组且数组前后标签要求不一致的bean转xml
以<LIST1 p_type="G">标签开始,以</LIST1>标签结束
在数组对象中引入@XmlAttribute
@XmlAttribute(name = "p_type")private String pType;
测试类:
//设置属性
descDTO.setPType("G");
public class XmlTest {public static void main(String[] args) {BookDTO bookDTO = new BookDTO();bookDTO.setBookName("name");bookDTO.setBookId("id");HeadDTO headDTO = new HeadDTO();headDTO.setSend("send");headDTO.setReceive("rece");RootDTO rootDTO = new RootDTO();rootDTO.setHead(headDTO);rootDTO.setData(bookDTO);DescDTO descDTO = new DescDTO();descDTO.setPType("G");descDTO.setDescription("desc11111");DescDTO descDTO1 = new DescDTO();descDTO1.setPType("G");descDTO1.setDescription("desc22222");ArrayList<DescDTO> descDTOS = new ArrayList<>();descDTOS.add(descDTO);descDTOS.add(descDTO1);bookDTO.setDescDTOList(descDTOS);String xml = XmlBeanUtils.beanToXml(rootDTO, XmlBeanUtils.ENCODING_GB, BookDTO.class);//bean转xmlSystem.out.println(XmlBeanUtils.beanToXml(rootDTO,XmlBeanUtils.ENCODING_GB,BookDTO.class));//xml转beanSystem.out.println(XmlBeanUtils.xmlToBean(xml, RootDTO.class,BookDTO.class));}
}
运行结果:

④针对<![CDATA[文本内容]]>标签
import javax.xml.bind.annotation.adapters.XmlAdapter;/*** @version : 1.0* @Description : <![CDATA]>* @Date: 2023/10/8 19:03**/
public class CdataXmlAdapter extends XmlAdapter<String, String> {public CdataXmlAdapter() {}public String marshal(String arg0) throws Exception {return "<![CDATA[" + arg0 + "]]>";}public String unmarshal(String arg0) throws Exception {return arg0;}
}
使用@XmlJavaTypeAdapter注解,在需要的字段上
@XmlElement(name = "name")@XmlJavaTypeAdapter(CdataXmlAdapter.class)private String bookName;
运行结果:

解决转义问题:
思路:
在将对象转换成xml时,会用到Marshaller对象,调用该对象的setProperty方法,注入第三步中实现的类,控制转换时不进行转义,实现自定义的CharacterEscapeHandler类,拦截JAXB的转义动作
在工具类原有的基础上引入下面的语句:
jar包
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;
//CData处理marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {public void escape(char[] ch, int start,int length, boolean isAttVal, Writer writer) throws IOException {writer.write(ch, start, length);}});
完整方法:
/*** Java Bean 转 Xml** @param bean - Java Bean* @param inheritClazz - Java Bean中嵌套的类,且有继承关系的Java Class* @return - xml*/public static String beanToXml(Object bean, String encoding,Class<?>... inheritClazz) {try {JAXBContext context = initContext(bean.getClass(), inheritClazz);Marshaller marshaller = context.createMarshaller();// 格式化xmlmarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// Marshaller.JAXB_ encoding xml的编码方式marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);// 去掉生成xml的默认报文头marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);//CData处理marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {public void escape(char[] ch, int start,int length, boolean isAttVal, Writer writer) throws IOException {writer.write(ch, start, length);}});StringWriter writer = new StringWriter();marshaller.marshal(bean, writer);return writer.toString();} catch (JAXBException e) {e.printStackTrace();}return null;}
运行结果:

相关文章:
JAXB 使用记录 bean转xml xml转bean 数组 继承 CDATA(转义问题)
JAXB 使用记录 部分内容引自 https://blog.csdn.net/gengzhy/article/details/127564536 基础介绍 JAXBContext类:是应用的入口,用于管理XML/Java绑定信息 Marshaller接口:将Java对象序列化为XML数据 Unmarshaller接口:将XML数…...
Linux Centos安装Sql Server数据库,结合cpolar内网穿透实现公网访问
目录 前言 1. 安装sql server 2. 局域网测试连接 3. 安装cpolar内网穿透 4. 将sqlserver映射到公网 5. 公网远程连接 6.固定连接公网地址 7.使用固定公网地址连接 前言 简单几步实现在Linux centos环境下安装部署sql server数据库,并结合cpolar内网穿透工具…...
Vulnhub系列靶机---Raven: 2
文章目录 信息收集主机发现端口扫描目录扫描用户枚举 漏洞发现漏洞利用UDF脚本MySQL提权SUID提权 靶机文档:Raven: 2 下载地址:Download (Mirror) 信息收集 靶机MAC地址:00:0C:29:15:7F:17 主机发现 sudo nmap -sn 192.168.8.0/24sudo arp…...
计算机视觉与深度学习 | 视觉惯性SLAM的基础理论
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 视觉惯性SLAM的基础理论 引言三维空间刚体的运动表示旋转矩阵(Rotatio…...
[电源选项]没有系统散热方式,没有被动散热选项
背景 笔记本的风扇声音太大,想改成被动散热方式,又不想影响性能。 于是我打开了控制面板\所有控制面板项\电源选项,点更改计划设置-> 更改高级电源设置。 想把散热方式改成被动散热。发现win11中好像没有这个选项了! 如何…...
房产中介租房小程序系统开发搭建
随着移动互联网的发展,租房小程序已经成为许多房产中介公司转型线上的重要工具。通过租房小程序,房产中介公司可以方便地展示房源信息、吸引租户、达成交易。那么,如何通过乔拓云网开发租房小程序呢?下面是详细的开发指南。 1.进入…...
RS485电路设计
引言 今天学习RS485电路的设计。 首先先来了解一下RS485电路是什么干什么。 RS485是一种串行通信协议,也是一种电气标准。它可以用于在远距离范围内传送数据,最长传输距离可以达到1200米,可以支持多个设备同时通信。RS485通常应用于工业自…...
分布式文件服务器——Windows环境MinIO的三种部署模式
上节简单聊到MinIO:分布式文件存储服务——初识MinIO-CSDN博客,但没具化,本节开始展开在Windows环境下 MinIO的三种部署模式:单机单节点、单机纠删码、集群模式。 部署的几种模式简要概括 所谓单机单节点模式:即MinI…...
科技资讯|9月新能源汽车零售74.3万辆,充电桩迎来发展高峰
据中国乘联会发布的初步数据,中国 9 月份乘用车市场零售 202.8 万辆,同比增长 6%,环比增 6%。今年以来,我国乘用车市场累计零售 1,524 万辆,同比增长 2%。 乘联会预计,9 月份新能源车市场零售 74.3 万辆&a…...
【C++ Primer Plus学习记录】指针——小结
目录 1.声明指针 2.给指针赋值 3.对指针解除引用 4.区分指针和指针所指向的值 5.数组名 6.指针算术 7.数组的动态联编和静态联编 8.数组表示法和指针表示法 1.声明指针 使用下面的格式声明指向特定类型的指针: typeName *pointerName; 2.给指针赋值 应将内…...
Android Studio for Platform (ASfP) 使用教程
文章目录 编写脚本下载源代码lunch 查看版本 归纳的很清楚,下载Repo并下载源码->可以参考我的 Framework入门のPiex 6P源码(下载/编译/刷机) 启动图标(重启生效) [Desktop Entry] EncodingUTF-8 NameAndroidStudio …...
【安全】linux audit审计使用入门
文章目录 1 audit简介2 auditctl的使用2 audit配置和规则3 工作原理4 audit接口调用4.1 获取和修改配置4.2 获取和修改规则4.3 获取审计日志 5 audit存在的问题5.1 内核版本5.2 审计日志过多造成的缓存队列和磁盘问题5.2 容器环境下同一个命令的日志存在差异 6 参考文档 1 audi…...
如何优雅的终止 Docker 容器
init 系统有以下几个特点: 它是系统的第一个进程,负责产生其他所有用户进程。 init 以守护进程方式存在,是所有其他进程的祖先。 它主要负责: 启动守护进程 回收孤儿进程 将操作系统信号转发给子进程 1. Docker 容器停止过程…...
SXSSFWorkbook-MinIo-大数据-流式导出
文章目录 前言业务现状架构思路技术细节生成摘要IDSXSSFWorkbookMinIomybatis 流查询PipedInputStream 保存到minio 总结 前言 由于业务涉及到数据比较大,用户对导出功能使用频繁,每次导出数据两10万以上。 为了减少数据库压力,及应用服务器…...
使用PyQt5创建图片查看器应用程序
使用PyQt5创建图片查看器应用程序 作者:安静到无声 个人主页 在本教程中,我们将使用PyQt5库创建一个简单的图片查看器应用程序。这个应用程序可以显示一系列图片,并允许用户通过按钮切换、跳转到不同的图片。 1. 准备工作 首先࿰…...
怎样制作一个展会场馆预约小程序
随着互联网的发展,展会行业也逐渐向数字化转型。展会场馆预约小程序作为展会线下向线上的延伸,能够让参展商和观众随时随地进行预约,大大提升了客户的体验。那么,如何制作一个展会场馆预约小程序呢?下面就以乔拓云平台…...
呼叫中心系统信息发送功能的应用
通常情况下功能比较齐全的呼叫中心系统都会有短信功能,那么短信功能在呼叫中心职场中有哪些应用呢? 呼叫中心系统中短信功能主要分为三部分:短信发送、待发送短信、短信发件箱,先来简单了解一下这三个功能在工作中如何使用。 短信…...
Android笔记(三)多Activity活动的切换中的简化处理
多Activity实现的跳转简单实现 Activity定义移动的界面。在本例中,介绍多个活动之间的切换的简化通用的实现。在本例中,定义三个活动MainActivity、FirstActivity和SecondActivity.要求能从MainActivity分别切换到FirstActivity和SecondActivity&#x…...
vue打包压缩
参考 https://www.cnblogs.com/lafitewu/p/8309305.html 注意:方法1和方法2不能同时用 取消打包的map config/index.js的productionSourceMap设置为false 抽取js 将部分常用又比较大的组件直接抽取为一个单独的js 打开webpack.base.conf.js,在module.exports.entry中添加想…...
Mysql5.7大限将至升级Mysql 8.0过程记录(未完)
一、前言 时间很快,到2023年10月底,MySQL 5.7就到了它的EOL(End of Life),届时将不会提供任何补丁,无法应对潜在的安全风险;是时候和 MySQL 5.7 说再见了!!!&…...
从蓝桥杯嵌入式真题到项目实战:如何把赛题代码改造成一个可配置的电压监控系统?
从竞赛到实战:构建可配置电压监控系统的嵌入式开发指南 参加过蓝桥杯嵌入式竞赛的同学,往往在赛后会有这样的困惑:那些为比赛而写的代码,真的能在实际项目中复用吗?答案当然是肯定的。本文将带你从第十届蓝桥杯嵌入式真…...
终极Gmail桌面体验:告别浏览器标签混乱,拥抱高效邮件管理
终极Gmail桌面体验:告别浏览器标签混乱,拥抱高效邮件管理 【免费下载链接】gmail-desktop :postbox: Gmail desktop app for macOS, Windows & Linux (formerly Gmail Desktop) 项目地址: https://gitcode.com/gh_mirrors/gm/gmail-desktop 厌…...
对比直接购买与通过Taotoken聚合使用大模型API的体验差异
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接购买与通过Taotoken聚合使用大模型API的体验差异 在开发和集成大模型能力的过程中,开发者或团队通常面临两种主…...
别再用默认筛选器了!用Tableau集和计算字段打造“老板最爱看”的交互仪表板
别再用默认筛选器了!用Tableau集和计算字段打造“老板最爱看”的交互仪表板 每次给管理层汇报数据时,最怕遇到什么场景?当你精心准备了20页分析报告,老板却直接翻到最后一页说:"我只关心A事业部和B事业部的表现&a…...
NCMconverter终极指南:3步轻松解密NCM音频,实现全平台播放自由 [特殊字符]
NCMconverter终极指南:3步轻松解密NCM音频,实现全平台播放自由 🎵 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter 你是否遇到过从音乐平台下载…...
Hotkey Detective:重塑Windows键盘操作的透明化洞察
Hotkey Detective:重塑Windows键盘操作的透明化洞察 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾在…...
在OpenClaw项目中接入Taotoken实现多模型Agent工作流
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在OpenClaw项目中接入Taotoken实现多模型Agent工作流 对于使用OpenClaw框架构建智能体工作流的开发者而言,如何稳定、灵…...
【亲测免费】 OpenCV 4.5.5 + opencv-contrib-4.5.5 编译所需下载文件说明
OpenCV 4.5.5 opencv-contrib-4.5.5 编译所需下载文件说明 【下载地址】OpenCV4.5.5opencv-contrib-4.5.5编译所需下载文件说明 OpenCV 4.5.5 opencv-contrib-4.5.5 编译所需下载文件说明本仓库提供了编译OpenCV 4.5.5及其贡献模块(opencv-contrib)所需的第三方依赖文件和额外…...
Apple Music断供后歌单全没?别慌!用iTunes导出的XML文件+Excel手动抢救歌单(保姆级图文教程)
Apple Music断供后歌单全没?别慌!用iTunes导出的XML文件Excel手动抢救歌单(保姆级图文教程) 当你发现Apple Music因断供导致精心收藏的歌单全部消失时,那种心情就像突然失去了多年的音乐记忆。别担心,这份…...
从B类到连续类:一篇讲透功放效率与带宽的“鱼与熊掌”兼得史
射频功率放大器的进化论:从B类到连续类的带宽革命 在无线通信技术狂飙突进的三十年里,有个看似矛盾的命题始终困扰着工程师:如何让功率放大器同时"吃得少"(高效率)和"干得多"(宽带宽&…...
