3

HashMultiMap (Guava ライブラリから) を含む Bean クラスを作成しました。JRE の XMLEncoder を使用して Bean を XML エンコードしたいと考えています。カスタム PersistenceDelegate を使用して、Bean をファイルに正常に書き込みました。ただし、XML を逆シリアル化しようとすると、例外が発生します。

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;
    }
}
4

1 に答える 1