Java 如何将XStream与相同数据的变体一起使用?
在我的场景中,我使用的是XStream,我需要能够在不同的变体中存储/解析相同的数据 考虑以下类别: 用户:Java 如何将XStream与相同数据的变体一起使用?,java,xml,xstream,Java,Xml,Xstream,在我的场景中,我使用的是XStream,我需要能够在不同的变体中存储/解析相同的数据 考虑以下类别: 用户: public class User implements Serializable { @XStreamAlias(value = "roles") private List<Role> roles = new ArrayList<Role>(); ... } public class Role implements Serializ
public class User implements Serializable
{
@XStreamAlias(value = "roles")
private List<Role> roles = new ArrayList<Role>();
...
}
public class Role implements Serializable
{
@XStreamAlias(value = "name")
private String name;
@XStreamAlias(value = "description")
private String description;
...
}
<roles>
<role>
<name>admin<name>
<description>Administrative role</description?
</role>
<role>
<name>deploy<name>
<description>Deployment role</description?
</role>
...
</roles>
我需要能够产生以下输出:
users.xml
<users>
<user>
<username>admin</username>
<password>password</password>
<roles>
<role>administrator</role>
</roles>
</user>
<user>
<username>deployer</username>
<password>password</password>
<roles>
<role>deploy</role>
</roles>
</user>
</users>
我的解析器类如下所示:
public class UserParser
extends GenericParser<User>
{
...
public XStream getXStreamInstance()
{
XStream xstream = new XStream();
xstream.autodetectAnnotations(true);
xstream.alias("user", User.class);
xstream.alias("users", List.class);
xstream.alias("role", Role.class);
xstream.alias("credentials", Credentials.class);
xstream.registerConverter(new RoleListConverter());
return xstream;
}
...
}
显然,当我注册这个转换器时,它会试图截取所有列表并出错。我在这里做错了什么?如何实现我的目标
提前谢谢 答案可能有点晚了。。。 无论如何 你可以定义
private class UserList extends ArrayList<User> {};
private class RoleList extends ArrayList<Role> {};
xstream.alias("users", UserList.class);
xstream.alias("roles", RoleList.class);
私有类UserList扩展了ArrayList{};
私有类RoleList扩展了ArrayList{};
别名(“用户”,UserList.class);
别名(“角色”,RoleList.class);
public class RoleListConverter
implements Converter
{
public boolean canConvert(Class clazz)
{
return AbstractList.class.isAssignableFrom(clazz);
}
public void marshal(Object value,
HierarchicalStreamWriter writer,
MarshallingContext context)
{
if (value instanceof List)
{
//noinspection unchecked
List<Role> roles = (List<Role>) value;
for (Role role : roles)
{
writer.startNode("role");
writer.setValue(role.getName());
writer.endNode();
}
}
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context)
{
List<Role> roles = new ArrayList<Role>();
while (reader.hasMoreChildren())
{
reader.moveDown();
Role role = new Role();
final String nodeName = reader.getNodeName();
if (nodeName.equals("role"))
{
role.setName(reader.getValue().trim());
roles.add(role);
}
reader.moveUp();
}
return roles;
}
}
public class UserParser
extends GenericParser<User>
{
...
public XStream getXStreamInstance()
{
XStream xstream = new XStream();
xstream.autodetectAnnotations(true);
xstream.alias("user", User.class);
xstream.alias("users", List.class);
xstream.alias("role", Role.class);
xstream.alias("credentials", Credentials.class);
xstream.registerConverter(new RoleListConverter());
return xstream;
}
...
}
java.lang.ClassCastException: org.foo.User cannot be cast to org.foo.Role
at org.foo.RoleListConverter.marshal(RoleListConverter.java:35)
private class UserList extends ArrayList<User> {};
private class RoleList extends ArrayList<Role> {};
xstream.alias("users", UserList.class);
xstream.alias("roles", RoleList.class);