使用JAXB时

没有多少示例可以说明这一点,但是如何在应用程序中使用JAXB可以在性能(和内存使用)方面产生巨大差异。

这个例子

在此博客文章中,我将使用一个名为Membership的示例对象,看起来像这样:

使用JAXB

我们将使用JAXB将对象与XML封送或从XML解封。

在静态块中创建上下文(或至少一次)

我通常看到的最大错误是在每个请求上都创建了JAXB上下文:

 public String marshal(Membership membership){ StringWriter stringWriter = new StringWriter(); try { JAXBContext context = JAXBContext.newInstance(Membership. class ); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.marshal(membership, stringWriter); String xml = stringWriter.toString(); stringWriter.close(); return xml; } catch (JAXBException | IOException ex) { throw new RuntimeException(ex); } } public Membership unmarshal(String xml) { try { JAXBContext context = JAXBContext.newInstance(Membership. class ); Unmarshaller u = context.createUnmarshaller(); return (Membership)u.unmarshal( new StringReader(xml)); } catch (JAXBException ex) { throw new RuntimeException(ex); } } 

(也可参见示例代码这里 )

这里的问题是创建上下文的JAXBContext.newInstance方法。 上下文仅在对象结构更改时更改,并且仅在代码更改时发生,因此我们可以安全地只执行一次,因此将其更改为在静态块中创建,如下所示:

 public String marshal(Membership memberships){ StringWriter stringWriter = new StringWriter(); try { Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.marshal(memberships, stringWriter); String xml = stringWriter.toString(); stringWriter.close(); return xml; } catch (JAXBException | IOException ex) { throw new RuntimeException(ex); } } public Membership unmarshal(String xml) { try { Unmarshaller u = context.createUnmarshaller(); return (Membership)u.unmarshal( new StringReader(xml)); } catch (JAXBException ex) { throw new RuntimeException(ex); } } private static JAXBContext context; static { try { context = JAXBContext.newInstance(Membership. class ); } catch (JAXBException ex) { throw new RuntimeException(ex); } } 

(也可参见示例代码这里 )

因此,让我们看看有什么区别。

批处理示例。

如果我们在一个循环中(一次一个)将10000个对象与XML相互转换,则结果如下:

 with Bad util Testing 10000  Marshal took: 10804 ms  13762 Unmarshal took: 13762 ms 

然后加上静态块:

 with Good util Testing 10000  Marshal took: 90 ms  Unmarshal took: 428 ms 

那就是编组速度120倍,解组速度快32倍!!

( 这里有完整的示例)

并发示例。

同样,对多个并发请求执行此操作时,您应该看到相同的结果。 因此,当我们将其部署到某个服务器上(在我的示例中是扎带 ),并将REST端点暴露给封送和封送时,我们可以使用诸如siege之类的东西来生成并发流量到服务器:

错误示例的输出:

 Transactions: 255 hits  Availability: 100.00 %  Elapsed time: 7.91 secs  Data transferred: 0.54 MB  Response time: 5.13 secs  Transaction rate: 32.24 trans/sec  Throughput: 0.07 MB/sec  Concurrency: 165.52  Successful transactions: 255  Failed transactions: 0  Longest transaction: 6.88  Shortest transaction: 3.47 

好例子的输出:

 Transactions: 255 hits  Availability: 100.00 %  Elapsed time: 1.80 secs  Data transferred: 0.53 MB  Response time: 0.52 secs  Transaction rate: 141.67 trans/sec  Throughput: 0.30 MB/sec  Concurrency: 73.12  Successful transactions: 255  Failed transactions: 0  Longest transaction: 0.78  Shortest transaction: 0.05 

注意“并发性”值的差异(并发性是平均同时连接数,该数字随着服务器性能下降而增加)

( 这里有完整的示例)

当文件很大时。

如果输入文件太大,则可能会收到java.lang.OutOfMemoryError异常。

为了确保可以有效地处理大文件,可以确保在创建输入时正在使用SAX Parser:

 public Membership unmarshalWithSAX(InputStream xml){ try { InputSource inputSource = new InputSource(xml); SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware( true ); spf.setValidating( true ); SAXParser saxParser = spf.newSAXParser(); saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); XMLReader xmlReader = saxParser.getXMLReader(); SAXSource source = new SAXSource(xmlReader, inputSource); Unmarshaller u = context.createUnmarshaller(); return (Membership)u.unmarshal(source); } catch (ParserConfigurationException | SAXException | JAXBException ex) { throw new RuntimeException(ex); } } private static final String JAXP_SCHEMA_LANGUAGE = " http://java.sun.com/xml/jaxp/properties/schemaLanguage " ; private static final String W3C_XML_SCHEMA = " http://www.w3.org/2001/XMLSchema " ; 

( 这里有完整的示例)

得到全部

您可以在一个简单的库中获得所有“好”的东西:

在您的代码中使用它

(参见https://github.com/phillip-kruger/jaxb-lib )

 <dependency> <groupId>com.github.phillip-kruger.jaxb-library</groupId> <artifactId>jaxb-lib</artifactId> <version> 1.0 . 0 </version> </dependency> 

元帅

 JaxbUtil jaxbUtil = new JaxbUtil(); byte [] xml = jaxbUtil.marshal(myJAXBObject); 

元帅

 JaxbUtil jaxbUtil = new JaxbUtil(); MyJAXBObject myJAXBObject = jaxbUtil.unmarshal(MyJAXBObject. class ,xml); 

获取JAXB对象的XSD

 XsdUtil xsdUtil = new XsdUtil(); String xsd = xsdUtil.getXsd(MyJAXBObject. class ); 

翻译自: https://www.javacodegeeks.com/2019/05/using-jaxb.html

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

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

相关文章

通信电平转换指南

在我们电路设计中&#xff0c;常常会遇到通信电平转换的问题&#xff0c;在应用电平转换的措施之前还需要判断进行电平转换的必要性。 如果你是用的是3.3V器件作为输出&#xff0c;而5V器件作为接收&#xff0c;那么这种低电平输出不会损坏器件&#xff0c;而且大部分3.3V器件输…

【渝粤教育】国家开放大学2018年秋季 0556-21T广告摄影 参考试题

科目编号&#xff1a;0579 座位号&#xff1a; 2019&#xff0d;1正考期末考试 电路及磁路(2) &#xff08;一&#xff09; 试 题 2019年1月 1&#xff0e;电路中的主要物理量是电流、电压、功率和能量&#xff0c;它们的定义式分别是&#xff1a; &#xff0c; &#xff0c…

如何将普通交换机实现POE供电?

PoE交换机是指能够通过网线为远端受电终端提供网络供电的交换机&#xff0c;是PoE供电系统中比较常见的供电设备&#xff0c;可是&#xff0c;如果一个交换机没有POE功能&#xff0c;那么可不可以额外加一个poe供电模块经过交换机给ap供电呢&#xff1f;接下来就由飞畅科技的小…

物联网技术在智慧消防中的应用

一、案例背景 今天看到一个新闻&#xff0c;标题很是吸引眼球&#xff0c;《“最后一个原始部落”被烧毁背后&#xff0c;商业化埋下的隐患》&#xff0c;里面讲到云南省临沧市沧源佤族自治县勐角乡翁丁村老寨发生火灾&#xff0c;村寨几乎全部被烧毁。2020年&#xff0c;翁丁村…

【无标题】物联网安全挑战:为什么企业现在必须评估它们

企业对物联网 (IoT) 的依赖正在增长&#xff0c;这不仅是向用户推送服务的一种手段&#xff0c;而且是维持与员工、合作伙伴、承包商甚至竞争对手的联系的一种手段。但人们越来越担心&#xff0c;组织急于从物联网中获得回报&#xff0c;而没有完全理解其风险&#xff0c;也没有…

如何从头开始以正确的面向对象方式创建Java Web Framework

您如何用Java设计Web应用程序&#xff1f; 您安装了Spring&#xff0c;阅读了手册&#xff0c;创建了控制器 &#xff0c;创建了一些视图&#xff0c;添加了一些注释 &#xff0c;它就可以工作了。 如果没有Spring &#xff08;Ruby中没有Ruby on Rails&#xff0c;PHP中没有Sy…

工业级光纤收发器使用“避坑”指南

工业级光纤收发器在使用中有很多的注意事项&#xff0c;往往这些注意事项经常被忽略。下面飞畅科技就整理了一些工业级光纤收发器使用“避坑”指南&#xff0c;大家可以仔细看看&#xff0c;引起重视。 使用工业级光纤收发器连接不同的设备时&#xff0c;必须注意使用的端口不…

物联网安全有哪些注意事项

然而&#xff0c;将网络边缘推向物联网及其他领域&#xff0c;通过显着增加犯罪分子可以利用的攻击媒介的数量和种类来侵入重要系统&#xff0c;从而增加了安全威胁- 它扩大了攻击面。最高奖项是存储系统中“静止”的数据以及跨网络和处理资源“运动”的数据&#xff0c;更不用…

【渝粤教育】国家开放大学2019年春季 0320-22T学前教育学 参考试题

科目编号&#xff1a;0320 座位号 2018-2019学年度第二学期期末考试 学前教育学 试题 2019年 7月 单选题&#xff08;本大题共7小题&#xff0c;每小题4分&#xff0c;共计28分&#xff09; 1.学前教育的基本内容是&#xff08; &#xff09;。 A.游戏活动 B.保育和教育活动 …

【渝粤教育】国家开放大学2018年春季 3912T★汽车底盘构造与维修 参考试题

试卷代号&#xff1a;3912 &#xff08;中央广播电视大学&#xff09;2018年春季学期“开放专科”期末考试 汽车底盘构造与维修试题 2018年7月 一、单项选择题&#xff08;下列各题的备选答案中&#xff0c;只有一个选项是正确的&#xff0c;请把正确答案的序号填写在括号内。1…

通信距离与哪些因素相关?为什么模块通信距离和厂家宣传的不一样?

现如今很多无线模块厂家都会提供一些样品给客户测试使用&#xff0c;但有些客户拿回去测试出来的距离并不理想&#xff0c;远远没有达到厂商测试的距离&#xff0c;这是为什么呢&#xff1f;下面本文就介绍一下在实际应用中影响无线模块通讯距离的因素以及如何确定实际距离。 其…

【渝粤教育】国家开放大学2018年秋季 1021t劳动与社会保障法 参考试题

试卷代号&#xff1a;1043 国民经济核算 试题&#xff08;开卷&#xff09; 2019年1月 一、单项选择题&#xff08;以下每小题各有四项备选答案&#xff0c;其中只有一项是正确的。每小题2分&#xff0c;共20分&#xff09; 1&#xff0e;机构单位可以分为两类( )。 A&#xf…

工业级光纤收发器一般能正常使用多长时间?

无论是厂商还是购买商在生产、选购工业级光纤收发器的时候&#xff0c;重要的参考指标就是它的使用寿命。那么&#xff0c;工业级光纤收发器的正常使用寿命大概有多长时间呢&#xff1f;接下来飞畅科技就来和大家简单聊一聊工业级光纤收发器的使用寿命&#xff0c;一起来看看吧…

2020-09-22

射频常用单位术语简介 1、dBm和dBW dBm是一个考征功率绝对值的值&#xff0c;是以1mW的功率做为参考&#xff0c;直接读作dBm或者dB毫 计算公式:10lg&#xff08;毫瓦标示的实际功率/1mW&#xff09;, 例如&#xff1a;0dBm1mW&#xff0c;10dBm10mW&#xff0c;17dBm50mW&…

【渝粤教育】国家开放大学2018年秋季 1049t金融法规 参考试题

试卷代号&#xff1a;1067 知识产权法 试题 2019年1月 一、单项选择题&#xff08;每小题2分&#xff0c;共20分&#xff09; 1&#xff0e;知识产权只在授予其权利的国家或者确认其权利的国家产生&#xff0c;并且只能在该国范围内发生法律效力受法律保护&#xff0c;这是知识…

红帽 jboss_红帽正式宣布发布JBoss BPM Suite 6和JBoss BRMS 6

红帽 jboss红帽公司刚刚宣布了这些期待已久的产品的全面上市 &#xff01; 要花费大量精力将社区代码转换为企业质量的软件&#xff0c;客户和最终用户可以在Red Hat支持的生产环境中使用这些代码。 现在是现在和潜在客户了解该产品&#xff0c;让合作伙伴开始使用它并学习基本…

关于延长物联网设备的生命周期

Telit IoT Platforms 首席信息安全官兼产品管理总监 Mihai Voicu 博士说&#xff0c;物联网在另一个关键方面不同于传统网络&#xff1a;它的设备预计具有更长的使用寿命&#xff0c;可能会延长超过十年或更长时间。这意味着他们将需要安全的双向端到端通信&#xff0c;并且能够…

工业交换机的几大“择机”标准,你学会了吗?

工业交换机现在是越来越普及了&#xff0c;很多相对较苛刻、复杂的工作环境基本都靠工业交换机来进行数据网络通信。但是&#xff0c;市场上形形色色的工业交换机非常多&#xff0c;如果企业安排你去采购一批交换机&#xff0c;你会选吗&#xff1f;就这个问题&#xff0c;下面…

Zigbee 联盟更名为连接标准联盟

新品牌标志着合作的标志&#xff0c;并为物联网行业创造信任标准 ZigBee联盟&#xff0c;数百家企业创建&#xff0c;维护&#xff0c;并为物联网&#xff08;IOT&#xff09;互联网提供开放的全球标准的组织&#xff0c;今天宣布其组织品牌重塑的连接标准联盟&#xff08;CSA …

程序员的前20个搜索和排序算法面试问题

大家好&#xff0c;如果您正在准备编程工作面试或正在寻找新工作&#xff0c;那么您知道这不是一个容易的过程。 在您职业的任何阶段&#xff0c;您都必须幸运地接到电话并进行第一轮面试&#xff0c;但是在初学者方面&#xff0c;当您寻找第一份工作时就更加困难。 这就是为什…