我写了一个包含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