如何序列化可序列化Bean中的接口

时间:2019-04-12 12:50:30

标签: java serialization

我有一个Serializable Bean类,该类由dozerMapper的接口实例MapperIF组成。在将PersistentManager添加到tomcat服务器的context.xm文件中之前,一切工作正常。使用PersistentManager,我将会话中的所有对象作为文件存储到文件夹中。但是在我添加了PersistentManager之后,由于Bean类中的MapperIF接口,它开始抛出NotSerializableException。在MapperIF中添加关键字transient可以解决NotSerializableException的问题,但是最终它以NullPointerException结尾,因为以下代码中的dozerMapper.map变为null。那么我该如何处理序列化我的bean类的情况。

@Autowired
private transient MapperIF dozerMapper;

    public Preferences getUiPreferences() {
    if (this.uiPreferences == null) {
        this.uiPreferences = ((Preferences) this.dozerMapper.map(
                getPrefernces(), Preferences.class));
    }
    return this.uiPreferences;
}  

1 个答案:

答案 0 :(得分:0)

MapperIF接口(或其Dozer 5.x替代品Mapper)未扩展Serializable。它的标准实现类也不实现它。因此,标准实现将无法序列化。

我可以想办法解决这个问题:

  • 请勿将MapperIF引用放入保存在会话中的对象中。它并不真正属于那里。这是DozerBeanMapper类的javadocs所说的:

      

    应在应用程序中将其用作/定义为单例。此类执行一次一次性初始化并加载自定义xml映射,因此出于性能原因,您将不想创建它的许多实例。通常,一个系统每个VM仅具有一个DozerBeanMapper实例。如果您使用的是IOC框架(例如Spring),则将Mapper定义为singleton =“ true”。如果您不使用IOC框架,则推土机jar中将提供一个DozerBeanMapperSingletonWrapper便利类。

    这意味着您不需要 MapperIF对象放入会话中。

  • 将字段声明为transient并实现自定义readObject的方法,该方法将在反序列化时从某个地方重新填充该字段。

  • 实现您自己的可序列化的自定义MapperIF / Mapper类。 (我没看过,但这可能是很多工作……或不可能。)