- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想序列化一个扩展 HashMap 的元素 Simple .
@Root(name = "settings")
@ElementMap(entry="element", key="id", attribute=true, required=true, empty=true)
public class Settings extends HashMap<String, Object> {
...
每当我序列化它时,我都没有得到任何错误,但我也会得到一个如下所示的空文件:
<settings/>
有没有办法做到这一点而不用创建内部对象,然后必须将所有方法委托(delegate)给它?
最佳答案
我想原因是,Simple 无法转换 HashMap。
如果我运行这段代码......
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:不支持类 java.util.HashMap 的转换
现在,这是我为您的类(class)序列化所做的工作:
我写了一个Converter用于转换 Settings
。
Converter
类:
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));
文件 test.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
注解在这里不起作用(异常),可能解决这个问题就可以解决整个问题
关于java - 使用 Simple 将 HashMap 序列化为根元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999035/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!