【问题标题】:Is there any way to disable ORMLite's check that a field declared with DataType.SERIALIZABLE implements Serializable?有什么方法可以禁用 ORMLite 对使用 DataType.SERIALIZABLE 声明的字段是否实现 Serializable 的检查?
【发布时间】:2013-03-19 04:55:24
【问题描述】:

问题标题几乎说明了一切。我有一个这样声明的字段:

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

根据上下文,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

现在,如果只有某种方法可以禁用检查,那么一切显然都会正常工作...

【问题讨论】:

    标签: collections ormlite serializable


    【解决方案1】:

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

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

    您可以扩展SerializableType 类和@Override isValidForField(...) 方法。在这种情况下,这将序列化集合。

    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());
        }
    }
    

    要使用它,您必须将@DatabaseField 中的dataType 替换为persisterClass

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

    我已添加到单元测试中以显示与此相关的工作代码。这是github change

    【讨论】:

    • 谢谢。应该想到这一点……事后看来这很明显。
    • @Gray LocalSerializableType 类型是什么?当我尝试创建此方法时,IDE 显示一些错误
    • 该代码旨在作为@DrMido 的示例。 LocalSerializableType 是你定义的。
    猜你喜欢
    • 2015-08-19
    • 2021-07-08
    • 2020-04-19
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2012-10-10
    相关资源
    最近更新 更多