【问题标题】:Serialization [Workaround] for ResourceBundleResourceBundle 的序列化 [解决方法]
【发布时间】:2016-06-15 19:42:02
【问题描述】:

所以我的问题如下: 对于我需要编写的应用程序,我必须实现将一些 DTO 存储到磁盘以供以后重用(以 JSON 格式)的能力。只是为您提供一个广泛的参考框架:DTO 包含流程/数据模型及其图形表示。

为了获得所需的 JSON 文件,我目前使用 Jackson。这对于大部分来说都很好,但是,在一个需要保存的对象中,我使用了 ResourceBundle(将程序本地化为不同的语言)。这正是问题所在,因为 Jackson 似乎无法序列化 ResourceBundle 对象(通过尝试知道,而且我迄今为止所做的研究基本上都告诉我相同的结果)。

所以我想问你是否知道如何让它工作,或者你是否找到了一些奇特的解决方法。

为了进一步说明,我将附加一些不是来自相关项目的示例代码,因为我是为其他人做的,我不确定他是否会喜欢发布他的代码。

public class SomeClass {
  private String name;
  private ResourceBundle bundle;

  public SomeClass(String name, ResourceBundle bundle) {
    this.name = name;
    this.bundle = bundle;
  }

  public String getName() {
    return this.name;
  }

  public ResourceBundle getBundle() {
    return this.bundle;
  }

  public void setName(String name) {
    this.name = name;
  }

  public void setBundle(ResourceBundle bundle) {
    this.bundle = bundle;
  }

  /*
    Here one could imagine some additional functionality making use of the 
    given ResourceBundle (something that has to be printed depending on the
    used language etc.). 
  */
}
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.util.ResourceBundle;

public class Saver {

  public static void main(String[] args) {
    Saver saver = new Saver();
    saver.run();
  }

  public void run() {
    ObjectMapper om = new ObjectMapper();
    ResourceBundle rb = ResourceBundle.getBundle("test");
    SomeClass sc = new SomeClass("SomeClass", rb);
    try {
      om.writeValue(new File("test.json"), sc);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

生成的堆栈跟踪如下所示:

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class sun.util.ResourceBundleEnumeration and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: SomeClass["bundle"]->java.util.PropertyResourceBundle["keys"])
  at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:230)
  at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:68)
  at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:32)
  at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:672)
  at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:678)
  at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
  at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:672)
  at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:678)
  at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
  at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
  at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3613)
  at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2929)
  at Saver.run(Saver.java:22)
  at Saver.main(Saver.java:14)

【问题讨论】:

  • 为什么?您不需要序列化 ​​ResourceBundle。它们是静态数据,并且已经在外部文件中。使字段瞬态。
  • 嗯,我刚试过。它没有解决问题。如果我添加 @JsonIgnore@JsonProperty 注释(如此处所述:stackoverflow.com/questions/9112900/…),错误就会消失。仍然存在的一个问题是,当我在加载文件之后,我不确定如何重新获得对包的访问权限。重新启动程序。可能是我只是弄错了,或者我确实错过了显而易见的事情。这就是为什么我会感谢进一步的提示。 (我已经花了 2 个多小时和同事一起尝试解决这个问题,所以我不只是懒惰)。
  • 我必须去,否则我可能会做一个例子......你可以尝试存储文件名并序列化/反序列化它,然后在 get ResourceBundle 中进行空检查并实例化如果你有文件名.或者,您可以制作客户序列化器/反序列化器。您可能还需要一个自定义 ResourceBundle 实现......
  • 非常感谢! String 解决方案似乎已经满足了我的要求。有时有一个简单而优雅的问题解决方案,但我往往总是想念它们。如果您将此作为真正的答案,我很乐意接受它作为官方解决方案。

标签: java json jackson serializable resourcebundle


【解决方案1】:

您应该检查您的 JSON Java 类,如果它包含可能会破坏您的应用程序的递归循环。如果是这种情况,请将@JsonIgnore 添加到相关属性以打破循环。

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2015-04-22
    • 2019-05-03
    • 2023-03-09
    • 2013-05-22
    • 2010-12-02
    • 2015-10-03
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多