2016-03-02 76 views
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) 
+1

爲什麼?您不需要序列化ResourceBundles。它們是靜態數據,它們已經在外部文件中。使場瞬變。 – EJP

+0

嗯,我只是試過。它沒有解決這個問題。如果我添加'@ JsonIgnore'和'@ JsonProperty'註釋(如此處所述:http://stackoverflow.com/questions/9112900/jackson-how-to-prevent-field-serialization),錯誤消失。 剩下的一個問題是,我無法確定在我加載文件後如何重新訪問包。重新啓動程序。可能是因爲我剛剛發生了錯誤,或者我確實錯過了顯而易見的事實。這就是爲什麼我會欣賞進一步的提示。 (我已經花了超過2小時與一位同事試圖解決這個問題,所以我不只懶惰)。 –

+0

我必須去或者我可以做一個例子... 你可以嘗試存儲文件名和序列化/反序列化,然後在獲取ResourceBundle做空檢查和實例化,如果你有文件名。 或者,您可以製作客戶序列化器/解串器。你可能需要一個自定義的ResourceBundle實現以及... –

回答

0

您應該檢查你的JSON Java類,如果它包含可以炸燬你的應用程序中的遞歸循環。如果是這種情況,則添加@JsonIgnore以打破相關屬性的循環。