Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XStream使用NamedMapConverter序列化自定义映射_Java_Android_Xstream - Fatal编程技术网

Java XStream使用NamedMapConverter序列化自定义映射

Java XStream使用NamedMapConverter序列化自定义映射,java,android,xstream,Java,Android,Xstream,我正在成功地用NamedMapConverter序列化包含HashMap的Base类。我的需求已更改,我需要将HashMap更改为扩展HashMap的自定义StringDictionary类 但是在使用了StringDictionary之后,我的序列化被破坏了。是否有方法配置XStream和/或NamedMapConverter以保留所需的xml输出,而无需编写自定义转换器 在Android上使用XStream 1.4.7 所需的xml输出: <base> <values

我正在成功地用
NamedMapConverter
序列化包含
HashMap
Base
类。我的需求已更改,我需要将
HashMap
更改为扩展
HashMap
的自定义
StringDictionary

但是在使用了
StringDictionary
之后,我的序列化被破坏了。是否有方法配置
XStream
和/或
NamedMapConverter
以保留所需的
xml
输出,而无需编写自定义转换器

在Android上使用XStream 1.4.7


所需的
xml
输出:

<base>
  <values>
    <val key="123">111</val>
    <val key="abc">aaa</val>
  </values>
</base>
<base>
  <values class="com.test.StringDictionary" serialization="custom">
    <unserializable-parents/>
    <map>
      <default>
        <loadFactor>0.75</loadFactor>
      </default>
      <int>4</int>
      <int>2</int>
      <string>123</string>
      <string>111</string>
      <string>abc</string>
      <string>aaa</string>
    </map>
  </values>
</base>

使用修改的
Base

public class Base
{
    public Map<String, String> values = new StringDictionary();
}

似乎没有上述定制转换器是不可能实现的。然而,在这种情况下,只需对现有转换器稍作调整即可提供自定义转换器。问题在于
NamedMapConverter.canConvert
方法,该方法必须被重写以包含自定义
StringDictionary

以下代码将为修改后的
Base
类生成所需的
xml
输出:

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>
XStream xs=new XStream();
别名(“base”,base.class);
NamedMapConverter c=新的NamedMapConverter(StringDictionary.class,xs.getMapper(),“val”,“key”,String.class,null,String.class,true,false,xs.getConverterLookup());
注册转换器(c);
111
aaa

如果没有上述自定义转换器,似乎是不可能实现的。然而,在这种情况下,只需对现有转换器稍作调整即可提供自定义转换器。问题在于
NamedMapConverter.canConvert
方法,该方法必须被重写以包含自定义
StringDictionary

以下代码将为修改后的
Base
类生成所需的
xml
输出:

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>
XStream xs=new XStream();
别名(“base”,base.class);
NamedMapConverter c=新的NamedMapConverter(StringDictionary.class,xs.getMapper(),“val”,“key”,String.class,null,String.class,true,false,xs.getConverterLookup());
注册转换器(c);
111
aaa