gpt4 book ai didi

java - 使用 JAXB 仅编码选定的字段

转载 作者:数据小太阳 更新时间:2023-10-29 01:58:34 28 4
gpt4 key购买 nike

我正在使用 JAXB 将 java 对象编码为 XML。我面临的问题是,并非所有 java 对象实例的成员变量都需要编码 XML。例如,我完整的 XML 文档应该看起来像-

<Disk>
<status>attached</status>
<size>10000000000</size>
<freeSpace>25600000<freeSpace>
<id>MI45563PO</id>
</Disk>

但是在更新的情况下,只有选定的属性会发生变化,并且只有更改的属性应该是编码 XML 的一部分。就像“status”属性可以更改为“detached”一样,在这种情况下,编码的 XML 应该如下所示-

<Disk>
<status>detached</status>
</Disk>

或者,在“freeSpace”更改的情况下,XML 应该看起来像-

<Disk>
<freeSpace>20000000<freeSpace>
</Disk>

我的问题: 将未更改的字段定义为 null(并因此将所有原始类型定义为包装类变量,如 Integer、Boolean 等)是获得所需结果的唯一解决方案吗?或者,JAXB 中是否有任何方法可以指定选定的字段,这些字段应该在生成的 XML 中编码,其余字段应该被忽略。

请注意,需要忽略和需要包含的字段集在任何时候都不是固定的。

最佳答案

如果你想对一个类有几个 View ,你应该创建decorator每个 View 的类。示例源代码:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;

public class Program {

public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(Disk.class,
OnlyDiskStatusDecorator.class, OnlyDiskFreeSpaceDecorator.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

Disk disk = new Disk();
disk.setStatus("attached");
disk.setSize(10000000000L);
disk.setFreeSpace(25600000L);
disk.setId("MI45563PO");

m.marshal(disk, System.out);
m.marshal(new OnlyDiskStatusDecorator(disk), System.out);
m.marshal(new OnlyDiskFreeSpaceDecorator(disk), System.out);
}

}

@XmlRootElement
class Disk {
private String status;
private long size;
private long freeSpace;
private String id;

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}

public long getSize() {
return size;
}

public void setSize(long size) {
this.size = size;
}

public long getFreeSpace() {
return freeSpace;
}

public void setFreeSpace(long freeSpace) {
this.freeSpace = freeSpace;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

@Override
public String toString() {
return "Disk [status=" + status + ", size=" + size + ", freeSpace="
+ freeSpace + ", id=" + id + "]";
}
}

@XmlRootElement(name = "Disk")
class OnlyDiskStatusDecorator {
private Disk disk;

public OnlyDiskStatusDecorator() {
}

public OnlyDiskStatusDecorator(Disk disk) {
this.disk = disk;
}

public String getStatus() {
return disk.getStatus();
}

public void setStatus(String status) {
}
}

@XmlRootElement(name = "Disk")
class OnlyDiskFreeSpaceDecorator {
private Disk disk;

public OnlyDiskFreeSpaceDecorator() {
}

public OnlyDiskFreeSpaceDecorator(Disk disk) {
this.disk = disk;
}

public long getFreeSpace() {
return disk.getFreeSpace();
}

public void setFreeSpace(long freeSpace) {
}
}

上面的例子打印:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<disk>
<freeSpace>25600000</freeSpace>
<id>MI45563PO</id>
<size>10000000000</size>
<status>attached</status>
</disk>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Disk>
<status>attached</status>
</Disk>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Disk>
<freeSpace>25600000</freeSpace>
</Disk>

我为类的两个 View 创建了两个装饰器。第一个装饰器用于状态更新,第二个装饰器用于更新 freeSpace 值。您还可以创建 XmlAdapter 的实现对于特定的序列化,但我认为它有点复杂。

关于java - 使用 JAXB 仅编码选定的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13571506/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com