0

デシリアライズされた Map インスタンスに新しいエントリを挿入しようとすると、例外は発生しませんが、Map は変更されません。この EntryPoint コードはそれをプローブします。私は何か悪いことをしていますか?

public class Test2 implements EntryPoint {

public interface SomeProxy {
    Map<String, List<Integer>> getStringKeyMap();
    void setStringKeyMap(Map<String, List<Integer>> value);
}

public interface BeanFactory extends AutoBeanFactory {
    BeanFactory INSTANCE = GWT.create(BeanFactory.class);

    AutoBean<SomeProxy> someProxy();
}

@Override
public void onModuleLoad() {
    SomeProxy proxy = BeanFactory.INSTANCE.someProxy().as();

    proxy.setStringKeyMap(new HashMap<String, List<Integer>>());
    proxy.getStringKeyMap().put("k1", new ArrayList<Integer>());
    proxy.getStringKeyMap().put("k2", new ArrayList<Integer>());

    String payload = AutoBeanCodex.encode(AutoBeanUtils.getAutoBean(proxy)).toString();
    proxy = AutoBeanCodex.decode(BeanFactory.INSTANCE, SomeProxy.class, payload).as();

    // insert a new entry into a deserialized map
    proxy.getStringKeyMap().put("k3", new ArrayList<Integer>());

    System.out.println(proxy.getStringKeyMap().keySet()); // the keySet is [k1, k2] :-( ¿where is k3? 
}

}

4

2 に答える 2

0

AutoBeanCodex.encode(AutoBeanUtils.getAutoBean(proxy)) .toString();はいけません。getPayLoad()になる

後でコードを確認しますが、それが問題の原因であるかどうかはわかりません。しかし、それは私の典型的なアプローチとは異なるものとして際立っていました.

于 2012-06-03T17:05:23.023 に答える
0

java.util.Set や java.util.List などのコレクション クラスは、Object インスタンスの観点から動作するため扱いにくいものです。コレクションをシリアライズ可能にするには、通常の型パラメーター (たとえば、Map<Foo,Bar>だけではなくMap) を使用して、コレクションに含まれると予想される特定の型のオブジェクトを指定する必要があります。生のコレクションまたはマップを使用すると、肥大化したコードが得られ、サービス拒否攻撃に対して脆弱になります。

フォント: http://www.gwtproject.org/doc/latest/DevGuideServerCommunication.html#DevGuideSerializableTypes

于 2014-04-29T12:51:19.097 に答える