当我尝试向反序列化的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?
}
}
答案 0 :(得分:0)
AutoBeanCodex.encode(AutoBeanUtils.getAutoBean(proxy)) .toString(); 不应该是 getPayLoad()
我稍后会检查代码,但我不知道是否会导致问题。但它确实与我的典型方法不同。
答案 1 :(得分:0)
诸如java.util.Set和java.util.List之类的集合类很棘手,因为它们根据Object实例进行操作。要使集合可序列化,您应该通过普通类型参数指定它们应包含的特定对象类型(例如,Map<Foo,Bar>
而不仅仅是Map
)。如果您使用原始集合或地图,您将获得臃肿的代码,并且容易受到拒绝服务攻击。
字体:http://www.gwtproject.org/doc/latest/DevGuideServerCommunication.html#DevGuideSerializableTypes