我寫了一個包含HashMultiMap(來自Guava庫)的bean類。我想使用JRE的XMLEncoder對XML進行編碼。使用自定義的PersistenceDelegate我已經成功將bean寫入文件。然而,當我試圖反序列化XML我得到異常:Java Bean與XMLEncoder的持久性
java.lang.NoSuchMethodException: <unbound>=HashMultimap.put("pz1", "pz2")
我在做什麼錯?
// create the bean
SomeBean sb = new SomeBean();
// add some data
HashMultimap<String, String> stateMap = HashMultimap.create();
stateMap.put("pz1", "pz2");
stateMap.put("pz3", "pz4");
sb.setStateMap(stateMap);
// encode as xml
FileOutputStream os = new FileOutputStream("myXMLFile.xml");
XMLEncoder encoder = new XMLEncoder(os);
encoder.setPersistenceDelegate(HashMultimap.class, new CustomPersistenceDelegate());
encoder.writeObject(sb);
// decode the xml
FileInputStream is = new FileInputStream("myXMLFile.xml");
XMLDecoder decoder = new XMLDecoder(is);
Object deSerializedObject = decoder.readObject();
class CustomPersistenceDelegate extends DefaultPersistenceDelegate
{
protected Expression instantiate(Object oldInstance, Encoder out)
{
return new Expression(oldInstance, oldInstance.getClass(), "create", null);
}
protected void initialize(Class<?> type, Object oldInstance, Object newInstance,
Encoder out)
{
super.initialize(type, oldInstance, newInstance, out);
com.google.common.collect.HashMultimap<String, String> m =
(com.google.common.collect.HashMultimap) oldInstance;
for (Map.Entry<String, String> entry : m.entries())
{
out.writeStatement(new Statement(oldInstance, "put",
new Object[] { entry.getKey(), entry.getValue() }));
}
}
}
public class SomeBean
{
private HashMultimap<String, String> stateMap;
public HashMultimap<String, String> getStateMap()
{
return stateMap;
}
public void setStateMap(HashMultimap<String, String> stateMap)
{
this.stateMap = stateMap;
}
}
我把你的代碼,並把它放到Junit測試,並沒有問題。它工作正常,沒有例外。你可以發佈完整的StackTrace嗎?見[這裏](http://txtup.net/Lndut) – 2013-04-08 21:06:46
薩姆我沒有得到一個完整的堆棧跟蹤。相反,調試窗口顯示如下:java.lang.Exception:Encoder:discarding statement HashMultimap.put(「pz3」,「pz4」); 繼續... java.lang.Exception:Encoder:discarding statement HashMultimap.put(「pz1」,「pz2」); 繼續... java.lang.NoSuchMethodException: = HashMultimap.put(「pz3」,「pz4」); 繼續... java.lang.NoSuchMethodException: = HashMultimap.put(「pz1」,「pz2」); 繼續... –
javacavaj
2013-04-09 13:51:52
山姆你能解碼的對象?我解碼時地圖是空的。 – javacavaj 2013-04-09 15:25:58