Java 如何将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

在我的场景中,我使用的是XStream,我需要能够在不同的变体中存储/解析相同的数据

考虑以下类别:

用户:

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);