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

2022-09-01 06:49:34

GWT 的序列化程序支持有限,但出于安全原因,它支持的类型白名单。我找到的文档,例如这个FAQ条目说,您要序列化的任何类型“都必须包含在序列化策略白名单中”,并且该列表是在编译时生成的,但没有解释编译器如何决定白名单上的内容。java.io.Serializable

生成的列表包含许多属于标准库的类型,例如 和 。我在尝试序列化时收到错误,它实现了接口,但不在白名单上。如何将此类型添加到列表中?java.lang.Stringjava.util.HashMapjava.sql.DateSerializable


答案 1

有一种解决方法:定义一个新类,其中包含要包含在序列化中的所有类型的成员字段。然后向 RPC 接口添加一个方法:Dummy

Dummy dummy(Dummy d);

实现就是这样:

Dummy dummy(Dummy d) { return d; }

异步接口将具有以下特性:

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

GWT 编译器将选取此内容,并且由于该类引用这些类型,因此会将它们包含在白名单中。Dummy

示例类:Dummy

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

答案 2

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

public String getStringForDates(ArrayList<java.util.Date> dates);

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

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

public Object getObjectForString(String str);

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