java - XStream JavaBeanConverter 不序列化属性

标签 java javabeans xstream

尝试使用 XStream 的 JavaBeanConverter 并遇到问题。很可能我遗漏了一些简单的东西,或者对 XStream 的转换器处理不够了解。

@XStreamAlias("test")
public class TestObject
{
    private String foo;

    public String getFoo()
    {
        //return foo; -- Adjusted for EDIT#2
        return foo.toLowerCase();
    }

    public void setFoo(String foo)
    {
        this.foo = foo;
    }
}

public void test() throws Exception
{
    XStream x = new XStream(new XppDriver());
    x.autodetectAnnotations(true);
    x.processAnnotations(TestObject.class);

    x.registerConverter(new JavaBeanConverter(x.getMapper()));

    TestObject o = new TestObject();
    //o.setFoo("bar"); -- Adjusted for EDIT#2
    o.setFoo("BAR");

    String xml = x.toXML(o);

    System.out.println(xml);

    /*
      Expecting...
        <test>
          <foo>bar</foo>
        </test>

      But instead getting...
        <test>
          <foo/>
        </test>         
    */
}

我尝试在 TestObject.getFoo() 方法上添加跟踪,看起来它正在被 XStream 调用,但数据并未写入输出流。

在查看 JavaBeanConverter 的源代码后,我的实现似乎应该可以工作,这让我相信我在 XStream 设置期间没有正确配置某些东西。

我是不是漏掉了一些简单的东西?

谢谢!


编辑 1

此外,如果有帮助,我正在为此使用以下 Maven 部门...

<dependency>
    <groupId>org.apache.servicemix.bundles</groupId>
    <artifactId>org.apache.servicemix.bundles.xstream</artifactId>
    <version>1.3_3</version>
</dependency>
<dependency>
    <groupId>org.apache.servicemix.bundles</groupId>
    <artifactId>org.apache.servicemix.bundles.xpp3</artifactId>
    <version>1.1.4c_3</version>
</dependency>


编辑2

我更改了 TestObject.getFoo() 方法以更好地解释我的目标。

我正在尝试使用 getters/setters 对内部对象的数据进行“清理”。 具体来说,我正在尝试清理传入的反序列化数据,同时尝试避免必须实现 Serializable 的 readResolve() 方法。

如果我实现了 readResolve 的方法,我将不得不在 setter 方法(对于其他地方的任何非反序列化传入数据集)和 readResolve(对于我反序列化的 XML 数据)中进行清理。

这就是为什么我使用 JavaBeanConverter 而不是 XStream 的常规基于字段的做法的原因...通过 getters/setters 强制数据。

希望这能更好地解释。

谢谢。

最佳答案

通过 XStream 的源代码,您可以在 com.thoughtworks.xstream.core.DefaultConverterLookup 中找到它。

public Converter lookupConverterForType(Class type) {
    Converter cachedConverter = (Converter) typeToConverterMap.get(type);
    if (cachedConverter != null) return cachedConverter;
    Iterator iterator = converters.iterator();
    while (iterator.hasNext()) {
        Converter converter = (Converter) iterator.next();
        if (converter.canConvert(type)) {
            typeToConverterMap.put(type, converter);
            return converter;
        }
    }
    throw new ConversionException("No converter specified for " + type);
}

您会注意到它返回 JavaBeanConverter 的 String,它这样做的原因是 JavaBeanConverter 将用于任何具有默认公共(public)构造函数(String 具有)的对象。

解决该问题的一种方法是降低 JavaBeanConverter 的优先级。

x.registerConverter(new JavaBeanConverter(x.getMapper()), -10);

然后 JavaBeanConverter 用于您的 Bean,SingleValueConverterWrapper 用于 String 值。

关于java - XStream JavaBeanConverter 不序列化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2456470/

相关文章:

java - 无法连接到受 Kerberos 保护的 Phoenix 数据源

java - 我如何知道映射器(或化简器)是否在Hadoop中并行运行?

Java:检查一个位是长的0还是1

java - 非 JSR299 bean 无法代理生产者方法

java - 如何在 Servlet 中创建/访问scopend bean?

java - 变量类型更改时的 XStream 反序列化

java - 道: diffrence between InMemory implementation and Database Implementation

Python 中的 JavaBean 等价物

java - 使用 Xstream 定义 XML 结构

java - 在以下情况下向后兼容 xstream