针对list类型的自定义Converter进行优化,提供参数实现Converter的复用。
首选对自定义Converter进行改造
public class OrgIDConverter implements Converter {
// 节点名称
private String nodeName;
// 构造方法
public OrgIDConverter(String nodeName) {
super();
this.nodeName = nodeName;
}
@SuppressWarnings("unchecked")
public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext arg2) {
// 将Object向下转型,因为有canConvert方法的判断,所以不用instanceOf判断
List<String> list = (List<String>) value;
for (String subval : list) {
// 将属性转换为自定义名称,不同的List集合只用在converter声明时提供参数即可
writer.startNode(nodeName);
writer.setValue(subval);
writer.endNode();
}
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
// 声明List集合,用于接受xml的orgID元素并存储
List<String> list = new ArrayList<String>();
while (reader.hasMoreChildren()) {
reader.moveDown();
String key = reader.getNodeName();
String value = null;
// 这一步可以省略,直接使用else内容,if的内容是orgID下还有层元素,嵌套遍历
if (reader.hasMoreChildren()) {
value = (String)unmarshal(reader, context);
} else {
value = reader.getValue();
}
list.add(value);
reader.moveUp();
}
return list;
}
public boolean canConvert(Class type) {
// 判断传入class的类型,注意:一定要使用声明类(List不能通过)
return type.equals(ArrayList.class);
}
}
修改注册方法,在实体类中进行注册:
public class InfoTest {
public static void main(String[] args) {
XStream stream = new XStream();
stream.alias("info", Info.class);
// 使用自定义Converter
stream.registerLocalConverter(Info.class, "orgIDs", new OrgIDConverter("orgID"));
stream.registerLocalConverter(Info.class, "roleIDs", new OrgIDConverter("roleID"));
// stream.alias("orgID", String.class);
// stream.alias("roleID", String.class); ///:xstream会已最后一个对String类型的名称,命名所有String类型
Info info = new Info();
List<String> orgIDs = new ArrayList<String>();
orgIDs.add("020120214");
orgIDs.add("020120215");
info.setOrgIDs(orgIDs);
List<String> roleIDs = new ArrayList<String>();
roleIDs.add("020120216");
roleIDs.add("020120217");
info.setRoleIDs(roleIDs);
System.out.println(stream.toXML(info));
}
}
之前文章的链接:http://winnie825.iteye.com/admin/blogs/1432064
分享到:
相关推荐
《XStream的高级用法与自定义输出结构详解》 ...本文仅对XStream的高级用法进行了概述,具体实践时还需要根据项目需求进行调整和优化。更多关于XStream的详细信息,可以通过提供的博文链接深入学习。
XStream通过使用自定义的转换器(Converter)和数据类型的安全性,使得这个转换过程既灵活又安全。例如,XStream提供了内置的转换器处理基本类型、集合、日期等,同时也支持用户自定义转换器以处理特定的复杂对象。 ...
XStream允许自定义类型转换器以处理特定类型的数据,例如日期。创建一个继承`XStreamConverter`的类,并注册到XStream实例: ```java import com.thoughtworks.xstream.converters.Converter; import ...
在本文中,我们将深入探讨XStream的使用方法,包括它的核心概念、配置、安全性和性能优化。 **1. 序列化到XML** XStream的核心功能是能够将Java对象转换成XML。首先,我们需要导入XStream库,并创建一个XStream...
3. **自定义转换器**:通过实现`com.thoughtworks.xstream.converters.Converter`接口,用户可以自定义对象的XML表示方式。 4. **排除字段**:使用`xstream.omitField()`方法可以排除特定字段不参与序列化和反序列...
内置的Converter支持多种常见的Java类型,开发者也可以自定义Converter处理特定类型的对象。 - **HierarchicalStreamWriter**:用于生成XML的接口,提供写入XML节点的方法,XStream使用它将Java对象转换为XML流。 ...
XStream 1.4 版本在之前的版本基础上进行了优化和增强,使其更加稳定和高效。本文将深入探讨 XStream 1.4 的主要功能、API 使用方法以及一些关键概念。 **1. XStream 基本原理** XStream 的工作原理是通过反射和...
对于自定义类型,开发者可以通过继承`com.thoughtworks.xstream.converters.Converter`接口并实现其方法来自定义转换逻辑。 接下来,我们谈谈xStream在处理XML时的特点。xStream的XML输出格式简洁明了,易于阅读,...
4. **自定义序列化和反序列化**:开发者可以通过实现 `Converter` 接口来自定义对象的 XML 表示,这提供了极大的灵活性。 5. **XML 格式控制**:XStream 支持多种 XML 格式风格,如 compact、human-readable 或 ...
要创建一个自定义转换器,你需要继承XStream的Converter或HierarchicalStreamConverter接口,并实现其必要的方法。例如,如果你有一个Date类型的字段,想要将其以自定义格式输出,你可以创建一个LocalConverter并...
1. 自定义类型转换器:通过实现`Converter`接口,可以创建自定义的类型转换逻辑,处理复杂的对象或自定义类型。 2. JSON支持:除了XML,XStream还支持JSON格式的序列化和反序列化,这在与JavaScript或现代Web服务...
- **Converter**: 转换器是XStream的核心,它们负责将Java对象与XML元素之间进行映射。XStream内建了一些标准转换器,如基本类型转换器、集合和数组转换器等。 - **HierarchicalStreamDriver**: 这个接口定义了...
XStream 1.3.1版本是在XStream的长期发展过程中的一次重要更新,可能包含了一些bug修复、性能优化以及新的特性和改进。 XStream的工作原理主要基于两个关键概念:转换器(Converter)和绑定(Aliasing)。转换器是...
2. 创建一个自定义的`Converter`来处理JSON转换: ```java import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.core.util.QuickWriter; import ...
4. **自定义转换策略**:通过实现`Converter`接口或使用`registerConverter()`方法,可以定制特定类型的转换逻辑。 四、最佳实践 1. **安全配置**:在生产环境中,应启用安全模式,防止XML注入攻击。可以通过`...
3. **自定义转换**:如果需要自定义XML元素的名称或者值,可以通过实现`Converter`接口来自定义转换逻辑。 4. **类型安全**:XStream允许设置安全模式,防止反序列化时的安全漏洞。 5. **XML格式**:XStream生成的...
对于自定义对象,开发者可以通过实现`com.thoughtworks.xstream.converters.Converter`接口来自定义转换逻辑。 2. **HierarchicalStreamDriver**:驱动程序是XStream的另一个关键组件,它负责将XML流解析为对象树或...
XStream的核心概念是“转换器(Converter)”,它是连接Java对象和XML表示的关键组件。转换器负责将Java对象的属性和类型映射到XML元素和属性上,反之亦然。XStream提供了一套内置的转换器,支持基本数据类型、集合...
虽然XStream不能对XML格式进行太多限制,但可以通过实现`Converter`接口来自定义对象的序列化和反序列化行为。这在处理特殊类型或者需要特定XML结构时非常有用。 4. **域类注解**: XStream支持使用注解来控制XML...
- **Converter** 和 **ConverterRegistry**:它们管理着 XStream 中的转换逻辑,定义了如何将对象转换成 XML 和反向转换。 4. **安全性与配置** - **安全性考量**:XStream 允许用户自定义转换器,但这也可能引入...