首页 > 解决方案 > XStream:不能同时反序列化属性和隐式集合

问题描述

我正在使用 xstream 反序列化这个 xml

<ERA>
    <SINGLE_VALUE_REMAP>
        <SUBJECT_GROUP></SUBJECT_GROUP>

        <VALUE_REMAP VALUE="IRRILEVANTE_RISCHIO">
            <ORIGINAL_VALUE>005</ORIGINAL_VALUE>
        </VALUE_REMAP>

        <VALUE_REMAP VALUE="BASSO_RISCHIO">
            <ORIGINAL_VALUE>003</ORIGINAL_VALUE>
        </VALUE_REMAP>

        <VALUE_REMAP VALUE="MEDIO_RISCHIO">
            <ORIGINAL_VALUE>010</ORIGINAL_VALUE>
        </VALUE_REMAP>

        <VALUE_REMAP VALUE="ALTO_RISCHIO">
            <ORIGINAL_VALUE>004</ORIGINAL_VALUE>
        </VALUE_REMAP>

        <VALUE_REMAP VALUE="ALTISSIMO_RISCHIO">
            <ORIGINAL_VALUE>002</ORIGINAL_VALUE>
        </VALUE_REMAP>

        <DEFAULT_VALUE>ERRATO_O_MANCANTE</DEFAULT_VALUE>
    </SINGLE_VALUE_REMAP>
</ERA>

这是我为描述 xml 而编写的 bean:

private class VALUE_REMAP {
        private List<String> ORIGINAL_VALUE;
        private String VALUE;        
    }

    private class SINGLE_VALUE_REMAP {
        private String SUBJECT_GROUP;
        private String DEFAULT_VALUE;
        private List<VALUE_REMAP> VALUE_REMAP;
    }

    private class ERA {
        private SINGLE_VALUE_REMAP SINGLE_VALUE_REMAP;
    }

这就是我尝试反序列化 xml 的方式

private ERA getERA() throws UnsupportedEncodingException, FileNotFoundException, IOException {
        XStream xstream = new XStream();
        xstream.addPermission(NoTypePermission.NONE);
        xstream.addPermission(NullPermission.NULL);
        xstream.addPermission(PrimitiveTypePermission.PRIMITIVES);
        xstream.allowTypeHierarchy(Collection.class);
        xstream.addImplicitCollection(VALUE_REMAP.class, "ORIGINAL_VALUE", String.class);
        xstream.addImplicitCollection(SINGLE_VALUE_REMAP.class, "VALUE_REMAP", VALUE_REMAP.class);
        xstream.allowTypesByWildcard(new String[]{
            "es.aprenet.riasconfigcore.custom.*",});
        xstream.alias("VALUE_REMAP", VALUE_REMAP.class);
        xstream.alias("SINGLE_VALUE_REMAP", SINGLE_VALUE_REMAP.class);
        xstream.alias("ERA", ERA.class);
        xstream.registerConverter(new ToAttributedValueConverter(VALUE_REMAP.class, xstream.getMapper(), xstream.getReflectionProvider(), xstream
                .getConverterLookup(), null));
        
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(possiblePath2.toString()), "UTF-8"));
        StringBuilder buff = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            buff.append(line);
        }
        return (ERA) xstream.fromXML(buff.toString());
    }

反序列化不抛出异常,但 original_value 集合为空: 在此处输入图像描述

奇怪的是,如果我删除转换器,则可以正确检索 originalValue 集合,但 VALUE_REMAP 的属性为空。

标签: javaxstream

解决方案


推荐阅读