0
所以我的問題是: 對於我需要寫的應用程序,我必須實現將某些DTO存儲到磁盤以便稍後重新使用(以JSON格式)的功能。爲了給你一個廣泛的參考框架:DTO包含過程/數據模型以及它們的圖形表示。對於ResourceBundle序列號[解決方案]
要獲得所需的JSON文件我目前使用傑克遜。對於最大的部分,這可以解決問題,但是,在需要保存的一個對象中,我使用ResourceBundle(爲不同語言本地化程序)。這正是問題出現的地方,因爲傑克遜似乎無法序列化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)
爲什麼?您不需要序列化ResourceBundles。它們是靜態數據,它們已經在外部文件中。使場瞬變。 – EJP
嗯,我只是試過。它沒有解決這個問題。如果我添加'@ JsonIgnore'和'@ JsonProperty'註釋(如此處所述:http://stackoverflow.com/questions/9112900/jackson-how-to-prevent-field-serialization),錯誤消失。 剩下的一個問題是,我無法確定在我加載文件後如何重新訪問包。重新啓動程序。可能是因爲我剛剛發生了錯誤,或者我確實錯過了顯而易見的事實。這就是爲什麼我會欣賞進一步的提示。 (我已經花了超過2小時與一位同事試圖解決這個問題,所以我不只懶惰)。 –
我必須去或者我可以做一個例子... 你可以嘗試存儲文件名和序列化/反序列化,然後在獲取ResourceBundle做空檢查和實例化,如果你有文件名。 或者,您可以製作客戶序列化器/解串器。你可能需要一個自定義的ResourceBundle實現以及... –