gpt4 book ai didi

XStream 在转换器中获取父对象

转载 作者:行者123 更新时间:2023-12-03 17:47:46 26 4
gpt4 key购买 nike

对于本地转换器,在编码到 XML 时,是否可以访问父对象?

我需要使用来自第三方源的项目编码集合 - 使用存储在父对象中的 id。

唉,似乎没有办法查询通向当前对象的对象路径。或者有吗?

最佳答案

我找到了一个有点反射的解决方案:

import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

import org.junit.Test;
import org.springframework.util.ReflectionUtils;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.path.Path;

import lombok.Data;

public class XStreamGetInfoFromParentTest {

@Test
public void smokeTest() {
InputStream file = XStreamGetInfoFromParentTest.class.getResourceAsStream("XStreamGetInfoFromParentTest.xml");

XStream xStream = new XStream() {
@Override
public void registerConverter(Converter converter, int priority) {
Converter myConverter = new MyConverterWrapper(converter);
super.registerConverter(myConverter, priority);
}
};
xStream.processAnnotations(Papa.class);
xStream.processAnnotations(Baby.class);

Papa papa = (Papa) xStream.fromXML(file);

System.out.println(papa);
}

public class MyConverterWrapper implements Converter {

private Converter converter;
private boolean isBabyClass;

public MyConverterWrapper(Converter converter) {
this.converter = converter;
}

@Override
public boolean canConvert(Class type) {
this.isBabyClass = type.equals(Baby.class);
return converter.canConvert(type);
}

@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
this.converter.marshal(source, writer, context);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
if (isBabyClass) {
AbstractReferenceUnmarshaller runm = (AbstractReferenceUnmarshaller) context;

Field field = ReflectionUtils.findField(AbstractReferenceUnmarshaller.class, "values");
field.setAccessible(true);
Map values = (Map) ReflectionUtils.getField(field, runm);

values.forEach((key, value) -> {
System.out.println(key + " : " + value);
});

Papa papa = (Papa) values.get(new Path("/papa"));
System.out.println(papa.firstname);
}

return converter.unmarshal(reader, context);
}

}

@XStreamAlias("papa")
@Data
public class Papa {

@XStreamAsAttribute
private String firstname;

private int age;

private List<Baby> babies;

}

@XStreamAlias("baby")
@Data
public class Baby {
private String firstname;
}

}

xml:
<?xml version="1.0" encoding="UTF-8"?>
<papa firstname="Adam">
<age>33</age>
<babies>
<baby>
<firstname>Eva</firstname>
</baby>
</babies>
</papa>

关于XStream 在转换器中获取父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29804019/

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