主页 > 互联网  > 

JAXB复杂对象反序列化

JAXB复杂对象反序列化

记录一次jaxb反序列化的使用,只是简单快速上手使用

一、xml文本 <InputProxyChannelStatusList version="1.0" xmlns="http:// .std-cgi /ver20/XMLSchema"> <InputProxyChannelStatus version="1.0"> <id>6</id> <sourceInputPortDescriptor> <proxyProtocol>HIKVISION</proxyProtocol> <addressingFormatType>ipaddress</addressingFormatType> <ipAddress>11</ipAddress> <managePortNo>11</managePortNo> <srcInputPort>1</srcInputPort> <userName>11</userName> <cameraType>none</cameraType> <streamType>auto</streamType> <deviceID></deviceID> </sourceInputPortDescriptor> <online>true</online> </InputProxyChannelStatus> <InputProxyChannelStatus version="1.0"> <id>8</id> <sourceInputPortDescriptor> <proxyProtocol>HIKVISION</proxyProtocol> <addressingFormatType>ipaddress</addressingFormatType> <ipAddress>11</ipAddress> <managePortNo>11</managePortNo> <srcInputPort>1</srcInputPort> <userName>11</userName> <cameraType>none</cameraType> <streamType>auto</streamType> <deviceID></deviceID> </sourceInputPortDescriptor> <online>true</online> </InputProxyChannelStatus> </InputProxyChannelStatusList> 二、对应的java对象

根据xml内容的层次关系定义对象

InputProxyChannelStatusListDTO @Data @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "InputProxyChannelStatusList",namespace = "http:// .std-cgi /ver20/XMLSchema") public class InputProxyChannelStatusListDTO implements Serializable { @XmlAttribute private String version; @XmlElement(name = "InputProxyChannelStatus", namespace = "http:// .std-cgi /ver20/XMLSchema") private List<InputProxyChannelStatusDTO> InputProxyChannelStatus; } InputProxyChannelStatusDTO @Data @XmlAccessorType(XmlAccessType.FIELD) public class InputProxyChannelStatusDTO implements Serializable { @XmlAttribute private String version; @XmlElement(name = "id",namespace = "http:// .std-cgi /ver20/XMLSchema") private Integer id; @XmlElement(name = "sourceInputPortDescriptor",namespace = "http:// .std-cgi /ver20/XMLSchema") private SourceInputPortDescriptorDTO sourceInputPortDescriptor; @XmlElement(name = "online",namespace = "http:// .std-cgi /ver20/XMLSchema") private boolean online; } SourceInputPortDescriptorDTO @Data @XmlAccessorType(XmlAccessType.FIELD) public class SourceInputPortDescriptorDTO implements Serializable { @XmlElement(name = "proxyProtocol", namespace = "http:// .std-cgi /ver20/XMLSchema") private String proxyProtocol; @XmlElement(name = "addressingFormatType", namespace = "http:// .std-cgi /ver20/XMLSchema") private String addressingFormatType; @XmlElement(name = "ipAddress", namespace = "http:// .std-cgi /ver20/XMLSchema") private String ipAddress; @XmlElement(name = "managePortNo", namespace = "http:// .std-cgi /ver20/XMLSchema") private int managePortNo; @XmlElement(name = "srcInputPort", namespace = "http:// .std-cgi /ver20/XMLSchema") private int srcInputPort; @XmlElement(name = "userName", namespace = "http:// .std-cgi /ver20/XMLSchema") private String userName; @XmlElement(name = "cameraType", namespace = "http:// .std-cgi /ver20/XMLSchema") private String cameraType; @XmlElement(name = "streamType", namespace = "http:// .std-cgi /ver20/XMLSchema") private String streamType; @XmlElement(name = "deviceID", namespace = "http:// .std-cgi /ver20/XMLSchema") private String deviceID; } 三、序列化和反序列代码 public static void main(String[] args) throws Exception{ String xmlStr=""; final JAXBContext jaxbContext = JAXBContext.newInstance(InputProxyChannelStatusListDTO.class); final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); final StringReader stringReader = new StringReader(xmlStr); final InputProxyChannelStatusListDTO unmarshal = (InputProxyChannelStatusListDTO)unmarshaller.unmarshal(stringReader); System.out.println(unmarshal); final StringWriter stringWriter = new StringWriter(); final Marshaller marshaller = jaxbContext.createMarshaller(); //格式化 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //编码 marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); //是否省略xml头信息 marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false); marshaller.marshal(unmarshal, stringWriter); System.out.println(stringWriter.toString()); } 四、注意要点

1、相信发现了,有个地方特别繁琐,就是每个元素的命名空间,在我使用的版本里边,每个元素都必须写上 namespace = “”,如果根节点不写会报错 意外的元素 (uri:"http:// .std-cgi /ver20/XMLSchema", local:"InputProxyChannelStatusList")。所需元素为<{}InputProxyChannelStatusList> 节点元素不写返回的值就是空,目前没有去深究,有些教程上边用的时全局处理注解,这里懒得处理,先用着。 2、另外就是jdk1.8带有jaxb,后续版本可能需要引入依赖,自己选择依赖版本,这里先展示一个,如果有问题可以自行查找可用依赖

<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.1</version> </dependency>
标签:

JAXB复杂对象反序列化由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“JAXB复杂对象反序列化