当前位置:  开发笔记 > 编程语言 > 正文

如何在GWT的序列化策略白名单中添加类型?

如何解决《如何在GWT的序列化策略白名单中添加类型?》经验,为你挑选了3个好方法。

GWT的序列化程序java.io.Serializable支持有限,但出于安全考虑,它支持的类型为白名单.我找到的文档,例如此FAQ条目表示您要序列化的任何类型"必须包含在序列化策略白名单中",并且列表是在编译时生成的,但不解释编译器如何决定什么在白名单上.

生成的列表包含许多属于标准库的类型,例如java.lang.Stringjava.util.HashMap.尝试序列化时出现错误java.sql.Date,该错误实现了Serializable接口,但不在白名单中.如何将此类型添加到列表中?



1> 小智..:

有一种解决方法:Dummy使用您希望包含在序列化中的所有类型的成员字段定义一个新类.然后在RPC接口中添加一个方法:

Dummy dummy(Dummy d);

实现就是这样:

Dummy dummy(Dummy d) { return d; }

而async接口将具有:

void dummy(Dummy d, AsyncCallback< Dummy> callback);

GWT编译器会选择它,因为Dummy类引用了这些类型,它会将它们包含在白名单中.

示例Dummy类:

public class Dummy implements IsSerializable {
    private java.sql.Date d;
}



2> rustyshelf..:

您在服务界面中包含的任何特定类型以及它们引用的任何类型都将自动列入白名单,只要它们实现java.io.Serializable,例如:

public String getStringForDates(ArrayList dates);

将导致ArrayList和Date都包含在白名单中.

如果您尝试使用java.lang.Object而不是特定类型,则会变得更加棘手:

public Object getObjectForString(String str);

因为编译器不知道白名单是什么.在这种情况下,如果对象未在服务接口中的任何位置引用,则必须使用IsSerializable接口显式标记它们,否则它将不允许您通过RPC机制传递它们.



3> pfranza..:

白名单由GWT编译器生成,包含IsSerializable标记接口指定的所有条目.

要向列表中添加类型,您只需确保该类实现IsSerializable接口.

此外,为了使序列化正常工作,类必须具有默认的无arg构造函数(如果需要,构造函数可以是私有的).此外,如果类是内部,则必须将其标记为静态.


应该添加 - 该类还需要一个公共默认的no-args构造函数.仅仅在没有它的情况下实现IsSerializable接口是不够的.经过一个小时的调试后发现这很难:)
@AdrianPetrescu这不完全正确.no args构造函数可能是私有的,但它必须在那里.此外,类本身不能是私有的,如果它是内部类,它必须是静态的.并且该类可能没有最终的非静态字段.
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有