有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用简单的

我想序列化一个用Simple扩展HashMap的元素

@Root(name = "settings")
@ElementMap(entry="element", key="id", attribute=true, required=true, empty=true)
public class Settings extends HashMap<String, Object> {

    ...

每当我序列化它时,不会出现任何错误,但我也会得到一个空文件,如下所示:

<settings/>

有没有办法做到这一点,而不需要创建一个内部对象,然后将所有方法委托给它


共 (1) 个答案

  1. # 1 楼答案

    我想原因是,Simple无法转换哈希映射

    如果我运行这个代码

        Map<String, Object> map = new HashMap<>();
        map.put("a", "b");
        map.put("c", 3);
        map.put("d", new Date());
    
    
        ser.write(map, new File("test2.xml"));
    

    。。。我得到以下例外:

    org.simpleframework.xml.transform.TransformException: Transform of class java.util.HashMap not supported


    现在,我做了些什么来序列化您的类:

    我写了一个Converter,用于转换Settings

    类:

    public class SettingsConverter implements Converter<Settings>
    {
        private Transformer transformer;
    
    
        public SettingsConverter()
        {
            this.transformer = new Transformer(new RegistryMatcher());
        }
    
    
    
        @Override
        public Settings read(InputNode node) throws Exception
        {
            Settings settings = new Settings();
            InputNode child = node.getNext();
    
            while( child != null )
            {
                final String key = child.getAttribute("key").getValue();
                final Class c = Class.forName(child.getAttribute("class").getValue());
    
                settings.put(key, transformer.read(child.getAttribute("value").getValue(), c));
                child = node.getNext();
            }
    
            return settings;
        }
    
    
        @Override
        public void write(OutputNode node, Settings value) throws Exception
        {
            for( Map.Entry<String, Object> entry : value.entrySet() )
            {
                OutputNode child = node.getChild("setting");
    
                child.setAttribute("key", entry.getKey());
                child.setAttribute("class", entry.getValue().getClass().getName());
                child.setAttribute("value", transformer.write(entry.getValue(), entry.getValue().getClass())); 
            }   
        }
    }
    

    类:

    @Root()
    @Convert(value=SettingsConverter.class)
    public class Settings extends HashMap<String, Object>
    {
        // ...
    }
    

    测试:

    final File testFile = new File("test.xml");
    
    Settings settings = new Settings();
    settings.put("a", "b");
    settings.put("c", 3);
    settings.put("d", new Date());
    
    // Serialize - make shure you use an AnnotationStrategy here
    Serializer ser = new Persister(new AnnotationStrategy());
    ser.write(settings, testFile); 
    
    
    // Deserialize
    Settings in = ser.read(Settings.class, testFile);
    
    System.out.println(settings.equals(in));
    

    文件测试。xml:

    <settings>
       <setting key="d" class="java.util.Date" value="2012-08-28 17:15:13.152 MESZ"/>
       <setting key="c" class="java.lang.Integer" value="3"/>
       <setting key="a" class="java.lang.String" value="b"/>
    </settings>
    

    我想有更好的方法(如果不是更多的话)来做到这一点,但也许这有点帮助

    另一点是,@Default注释在这里不起作用(例外),解决这个问题可能会解决整个问题