描述:当实体类中出现两个存放String类型的List集合时,使用xstream的alias方法无法分别转换其为对应的名称。
<?xml version="1.0" encoding="UTF-8"?>
<info>
<rogIDs>
<orgID>020120214</orgID>
<orgID>020120215</orgID>
</rogIDs>
<roleIDs>
<roleID>020120216</roleID>
<roleID>020120217</roleID>
</roleIDs>
</info>
此时需要使用自定义的Converter实现list元素的分别命名
public class OrgIDConverter implements Converter {
@SuppressWarnings("unchecked")
public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext arg2) {
// 将Object向下转型,因为有canConvert方法的判断,所以不用instanceOf判断
List<String> list = (List<String>) value;
for (String subval : list) {
// 该名称orgIDs集合的String类型元素名称
writer.startNode("orgID");
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);
}
}
roleIDs的内容和上面的java代码类似,将元素名称orgID修改为roleID即可。
PS:1.动态判断传入的List名称,从而使用一个类完成不同List(orgIDs、roleIDs)的标签转换;
2.更加方便的解决方案。
以上两个问题,如果大家有方案和思路,谢谢留言。
以上问题已经找到优化方案,详见:http://winnie825.iteye.com/admin/blogs/1439933
分享到:
相关推荐
《XStream的高级用法与自定义输出结构详解》 XStream是一款强大的Java库,用于将Java对象序列化为XML,以及将XML反序列化回Java对象。它以其简洁的API和灵活的配置赢得了广大开发者喜爱。在日常开发中,我们不仅...
标题提到的“XStream的Date转换 @XStreamConverter DateConverter”主要涉及两个核心概念:XStream的转换器(Converter)和`@XStreamConverter`注解。转换器是XStream的核心机制之一,它负责将Java对象转化为XML元素...
要创建一个自定义转换器,你需要继承XStream的Converter或HierarchicalStreamConverter接口,并实现其必要的方法。例如,如果你有一个Date类型的字段,想要将其以自定义格式输出,你可以创建一个LocalConverter并...
4. **自定义转换器**:对于复杂的数据类型或者自定义对象,可以通过实现XStream的Converter接口来自定义XML到Java对象的转换逻辑。 5. **XML格式**:XStream允许用户自定义XML的输出格式,如缩进、命名空间等。 6. *...
通过实现`com.thoughtworks.xstream.converters.Converter`接口并注册到XStream实例中,可以控制对象到XML的转换过程。 五、安全与配置 由于XStream可以直接将任何Java对象序列化,可能存在安全风险。为了防止恶意...
XStream允许自定义类型转换器以处理特定类型的数据,例如日期。创建一个继承`XStreamConverter`的类,并注册到XStream实例: ```java import com.thoughtworks.xstream.converters.Converter; import ...
XStream通过使用自定义的转换器(Converter)和数据类型的安全性,使得这个转换过程既灵活又安全。例如,XStream提供了内置的转换器处理基本类型、集合、日期等,同时也支持用户自定义转换器以处理特定的复杂对象。 ...
通过实现`com.thoughtworks.xstream.converters.Converter`接口并注册到XStream实例中,你可以控制XML的生成和解析过程。 **安全模式** 为了防止XSS攻击,XStream提供了安全模式,可以限制哪些类可以被序列化或反...
3. **自定义转换器**:通过实现`com.thoughtworks.xstream.converters.Converter`接口,用户可以自定义对象的XML表示方式。 4. **排除字段**:使用`xstream.omitField()`方法可以排除特定字段不参与序列化和反序列...
你可以通过实现`com.thoughtworks.xstream.converters.Converter`接口来创建自定义转换器,并注册到XStream实例中。 总的来说,XStream是一个强大且灵活的工具,用于在Java对象和XML之间进行数据交换。它简化了序列...
3. **自定义转换器**:对于复杂的对象结构或者特殊类型的转换,可以通过实现`Converter`接口来自定义转换逻辑。 4. **域级注解**:XStream提供了`@XStreamAlias`、`@XStreamAsAttribute`等注解,允许开发者在类或...
对于 XStream 不支持的复杂类型,可以通过实现 `Converter` 接口或继承 `AbstractSingleValueConverter` 来自定义转换逻辑。 ```java xstream.registerConverter(new MyCustomConverter()); ``` ### 6. **安全性与...
内置的Converter支持多种常见的Java类型,开发者也可以自定义Converter处理特定类型的对象。 - **HierarchicalStreamWriter**:用于生成XML的接口,提供写入XML节点的方法,XStream使用它将Java对象转换为XML流。 ...
**XStream库详解** ...通过理解和掌握其核心特性、安全性设置以及自定义转换器,开发者可以在项目中充分利用XStream的优势,提高代码的可读性和可维护性。同时,了解如何优化性能也是确保系统高效运行的关键。
为了处理这种情况,我们需要创建相应的 Java 类(`Param`, `Name`, `Value`)以及两个转换器(`NameConverter`, `ValueConverter`),这些转换器需要实现 `com.thoughtworks.xstream.converters.Converter` 接口。...
"Xstream register 转换器"这个主题主要涉及到如何自定义转换器来处理特定类型的对象,以便更好地控制XML的输出格式或者解决某些复杂类型的序列化问题。在这篇博客文章中(虽然链接未提供具体内容),作者可能详细...
xStream允许你自定义对象的序列化和反序列化过程。通过实现`Converter`接口,你可以控制对象如何被转换为XML或JSON,以及如何从这些格式恢复。 ```java public class CustomPersonConverter implements Converter {...
通过这个示例,我们可以了解到XStream如何简化Java对象与XML之间的转换,以及如何自定义转换规则以满足特定需求。无论是进行数据持久化,还是进行网络数据交换,XStream都是一个非常实用的工具。在深入研究源码时,...
XStream 的核心概念是通过自定义的“转换器(Converter)”来处理特定类型的 Java 类。转换器负责将对象转换成 XML 格式,以及将 XML 解析回对应的 Java 对象。XStream 提供了丰富的内置转换器来处理标准的 Java ...