【问题标题】:Alternative Entity-Conversion with XStream使用 XStream 的替代实体转换
【发布时间】:2014-06-16 15:10:10
【问题描述】:

我们正在使用 XStream 来序列化和反序列化实体。如果实体是持久化的,它们有一个 ID,并且对象的序列化形式只是 ID,它可能看起来像:

<Person>4</Person>

“反序列化”只是从数据库中读取操作。

这很好地实现了SingleValueConverter,它使用 DAO 加载实体:

public class TestSerializer implements SingleValueConverter {
    public Object fromString(String str) {
        return dao.readById(str);
    }
    public String toString(Object obj) {
        return ((Entity) obj).getId();
    }
}

但在某些情况下,必须序列化的实体不会被持久化。所以他们没有ID,我必须做一个“真正的”序列化。因为 XStream 知道如何自己序列化许多对象,而且我不关心 XML 结果的结构,所以如果我能得到这样的东西就好了:

<Person>
  <name>Jon Doe</name>
</Person>

那么是否可以在自定义转换器实现中进行这种序列化和反序列化?

【问题讨论】:

    标签: java serialization xstream


    【解决方案1】:

    在转换器中,您可以随意以任何您喜欢的方式进行转换。所以基本上你可以在你的自定义转换器中决定你想如何(反)序列化对象。但是,AFAIK 您不能在单值转换/正常转换之间切换。但是您的示例 XML 暗示了这一点。

    如果您只想委托给另一个转换器,例如 XStream 的ReflectionConverter,您可以使用convertAnother(Object, Converter)-方法(另请参阅this question/answer)来完成。为此,您必须实现Converter 接口而不是SingleValueConverter,才能访问(未)编组上下文。

    这能回答你的问题吗?

    hth,
    - 马丁

    【讨论】:

    • 这种方法的问题是,我必须准确地告诉 XStream 使用哪个转换器进行进一步的序列化。但我不想这样做,因为我不想影响定义良好且经过微调的序列化过程。基本上,在我的自定义转换器中,我要做的就是让 XStream 序列化我的实体,而不使用我的自定义转换器(但其他一切都按照配置)。
    【解决方案2】:

    Underscore-java可以读写xml文件。我是项目的维护者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-03
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多