【发布时间】: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