JAXBContext学习笔记(1)

本文展示了如何使用Java的JAXB库将对象转换为XML格式,并详细介绍了编码、格式化输出和片段处理的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
 * Created by Administrator on 2014-05-14.
 */
public class AutoBean{
    public static void main(String[] args) throws JAXBException {
        JAXBContext jaxbContext =JAXBContext.newInstance(SimpleObject.class);
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING,"utf-8");//编码格式
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);//是否省略xml头信息(<?xml version="1.0" encoding="utf-8" standalone="yes"?>)
        SimpleObject people = new SimpleObject();
        marshaller.marshal(people, System.out);
    }
}
@XmlRootElement
class SimpleObject{
//    @XmlElement
    public String publicS="publicS";
//    @XmlElement
    protected String protectedS="protectedS";
    @XmlElement
    String defaultS="defaultS";
//    @XmlElement
    private String privateS="privateS";
//    public String getPublicS() {
//        System.out.println("getPublicS");
//        return publicS;
//    }
//
//    public void setPublicS(String publicS) {
//        System.out.println("setPublicS");
//        this.publicS = publicS;
//    }
//    public String getProtectedS() {
//        System.out.println("getProtectedS");
//        return protectedS;
//    }
//
//    public void setProtectedS(String protectedS) {
//        System.out.println("setProtectedS");
//        this.protectedS = protectedS;
//    }
//
//    public String getDefaultS() {
//        System.out.println("getDefaultS");
//        return defaultS;
//    }
//
//    public void setDefaultS(String defaultS) {
//        System.out.println("setDefaultS");
//        this.defaultS = defaultS;
//    }
//
    public String getPrivateS() {
        System.out.println("getPrivateS");
        return privateS;
    }
    public void setPrivateS(String privateS) {
        System.out.println("setPrivateS");
        this.privateS = privateS;
    }
}

按照上面的代码,进行不同的注释可以发现

如果一个属性书public,则会进入xml文件,其他不会

如果一个属性加有@XmlElement标记,则会进入xml文件,即使是private

如果有getter,则getter会被调用(会被调用三次?!!!)

如果通过属性和getter都可以访问则会报错,这么说来对于pojo可以直接用,无需加上注释

转载于:https://my.oschina.net/u/1442901/blog/265565

### 使用 JAXBContext 进行 Java XML 绑定 #### 创建 JAXBContext 实例 为了使用 `JAXBContext` 来处理 XML 和 Java 对象之间的转换,首先需要创建一个 `JAXBContext` 的实例。这可以通过指定要序列化或反序列化的类来完成。 ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; public class Example { public static void main(String[] args) throws JAXBException { Class<?>[] classesToBeBound = new Class[]{Order.class}; JAXBContext jaxbContext = JAXBContext.newInstance(classesToBeBound); } } ``` 此代码片段展示了如何通过提供一组类给静态方法 `newInstance()` 来初始化一个新的 `JAXBContext` 实例[^1]。 #### 序列化对象到 XML 文档 一旦有了 `JAXBContext` 实例,就可以利用它来进行对象至XML文档的转换操作: ```java import javax.xml.bind.Marshaller; // ... other imports ... Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); StringWriter sw = new StringWriter(); marshaller.marshal(orderObject, sw); // orderObject 是待序列化的对象 System.out.println(sw.toString()); ``` 上述例子说明了怎样设置格式化输出属性并调用 `marshal()` 方法将对象写入字符串流中。 #### 反序列化 XML 到 Java 对象 同样地,也可以从 XML 文件读取数据并将它们映射回相应的 Java 类型: ```java import java.io.StringReader; import javax.xml.bind.Unmarshaller; // ... other imports ... Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); String xmlContent = "<order><id>1</id></order>"; StringReader reader = new StringReader(xmlContent); Order deserializedOrder = (Order)unmarshaller.unmarshal(reader); ``` 这里演示的是如何解析一段简单的 XML 字符串,并将其内容解码成对应的 Java Bean 实例。 #### 处理常见问题 当遇到与 `JAXBContext` 相关的问题时,可以考虑以下几个方面: - **命名空间冲突**: 如果应用程序涉及多个不同的 XML 命名空间,则可能需要更复杂的配置以确保正确识别各个元素。 - **性能优化**: 对于大型项目来说,频繁创建新的 `JAXBContext` 实例可能会带来不必要的开销;因此建议重用已有的上下文实例。 - **自定义适配器**: 当默认行为无法满足需求时(例如日期时间字段),可通过编写定制化的 `XmlAdapter` 子类来自定义特定类型的编组/解组逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值