我正在使用Base
成功序列化包含HashMap<String, String>
的{{1}}课程。我的要求已更改,我需要将NamedMapConverter
更改为扩展HashMap
的自定义StringDictionary
类。
但在使用HashMap<String, String>
后,我的序列化被破坏了。有没有办法配置StringDictionary
和/或XStream
以保留所需的NamedMapConverter
输出,而无需编写自定义转换器?
在Android上使用XStream 1.4.7。
必需xml
输出:
xml
带有<base>
<values>
<val key="123">111</val>
<val key="abc">aaa</val>
</values>
</base>
和Base
配置的 HashMap
类产生以上输出
XStream
使用修改后的public class Base
{
public Map<String, String> values = new HashMap<>();
}
Base base = new Base();
base.values.put("abc", "aaa");
base.values.put("123", "111");
XStream xs = new XStream();
xs.alias("base", Base.class);
NamedMapConverter c = new NamedMapConverter(xs.getMapper(), "val", "key", String.class, null, String.class, true, false, xs.getConverterLookup());
xs.registerConverter(c);
String s = xs.toXML(base);
类
Base
产生以下不正确的public class Base
{
public Map<String, String> values = new StringDictionary();
}
输出:
xml
答案 0 :(得分:0)
NamedMapConverter.canConvert
方法,必须重写以包含自定义StringDictionary
类。
以下代码将为修改后的xml
类生成所需的Base
输出:
XStream xs = new XStream();
xs.alias("base", Base.class);
xs.addDefaultImplementation(StringDictionary.class, Map.class);
NamedMapConverter c = new NamedMapConverter(xs.getMapper(), "val", "key", String.class, null, String.class, true, false, xs.getConverterLookup())
{
public boolean canConvert(Class type)
{
if (type.equals(StringDictionary.class)) return true;
else return super.canConvert(type);
}
};
xs.registerConverter(c);
另一个更简单(但不完全兼容)的解决方案是将StringDictionary
类传递给NamedMapConverter
构造函数。但是,此解决方案将略微更改xml
输出。
XStream xs = new XStream();
xs.alias("base", Base.class);
NamedMapConverter c = new NamedMapConverter(StringDictionary.class, xs.getMapper(), "val", "key", String.class, null, String.class, true, false, xs.getConverterLookup());
xs.registerConverter(c);
<base>
<values class="com.test.StringDictionary">
<val key="123">111</val>
<val key="abc">aaa</val>
</values>
</base>