是否有任何方法可以禁用ORMLite检查使用DataType.SERIALIZABLE声明的字段实现Serializable?

Jul*_*les 0 collections serializable ormlite

问题标题只是说明了一切.我有一个声明如下的字段:

    @DatabaseField(canBeNull=false,dataType=DataType.SERIALIZABLE)
    List<ScheduleTriggerPredicate> predicates = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)

根据上下文,predicates可以包含空列表或返回不可变列表Collections.unmodifiableList(List)ArrayList作为它的参数.因此,我知道有问题的对象是可序列化的,但我无法告诉编译器(以及因此ORMLite)它是什么.因此我得到这个例外:

SEVERE: Servlet /ADHDWeb threw load() exception
java.lang.IllegalArgumentException: Field class java.util.List for field
    FieldType:name=predicates,class=ScheduleTrigger is not valid for type 
    com.j256.ormlite.field.types.SerializableType@967d5f, maybe should be
    interface java.io.Serializable
Run Code Online (Sandbox Code Playgroud)

现在,如果只是某种方式来禁用支票,一切显然都会正常工作......

Gra*_*ray 6

定义自定义数据类型在FM中有很好的记录:

http://ormlite.com/docs/custom-data-types

您可以扩展的SerializableType@OverrideisValidForField(...)方法.在这种情况下,这将序列化集合.

public class SerializableCollectionsType extends SerializableType {
    private static LocalSerializableType singleton;
    public SerializableCollectionsType() {
        super(SqlType.SERIALIZABLE, new Class<?>[0]);
    }
    public static LocalSerializableType getSingleton() {
        if (singleton == null) {
            singleton = new LocalSerializableType();
        }
        return singleton;
    }
    @Override
    public boolean isValidForField(Field field) {
        return Collection.class.isAssignableFrom(field.getType());
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用此您必须更换dataTypepersisterClass@DatabaseField:

@DatabaseField(canBeNull = false,
    persisterClass = SerializableCollectionsType.class)
List<ScheduleTriggerPredicate> predicates = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)

我已经添加到单元测试中以显示工作代码.这是github的变化.