小编典典

如何在ORMLite中指定对象自定义序列化?

java

我想将某些类型为ParentClass的字段作为json字符串存储到我的数据库中。我不想使用Serializable接口和DataType.SERIALIZABLE导致它与序列化类的完整类名相关联。

所以我正在使用以下代码:

class ParentClass {

    @DatabaseField(persisterClass = MyFieldClassPersister.class)
    private MyFieldClass myField;
}

持久性类的一种:

public class MyFieldClassPersister extends StringType {

    private static final MyFieldClassPersister singleTon = new MyFieldClassPersister();

    public static MyFieldClassPersister getSingleton() {
        return singleTon;
    }

    protected MyFieldClassPersister() {
        super(SqlType.STRING, new Class<?>[0]);
    }

    @Override
    public Object parseDefaultString(FieldType fieldType, String defaultStr) {
        return jsonStringToObject(defaultStr);
    }

    @Override
    public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException {
        String string = results.getString(columnPos);
        return jsonStringToObject(string);
    }

    private static MyFieldClass jsonStringToObject(String string) {
        // json to object conversion logic
    }

}

这是我遇到的两个问题:

  1. 我没有得到如何指定从对象到字符串的自定义转换的信息。似乎ORMLite调用Object.toString()以获得对象的字符串表示形式。在Persister中有一些方法非常好,我可以在其中指定如何将Object转换为字符串(在我的情况下为json)。是的,我可以在MyFieldClass中重写toString()方法,但是在Persister中执行转换更为方便。为了指定从模型对象到db-object的转换,我可以重写任何方法吗?

  2. 如果我将自定义字段类型标记为String类型:

    class ParentClass {
    
    @DatabaseField(dataType = DataType.STRING, persisterClass = MyFieldClassPersister.class)
    private MyFieldClass myField;
    

    }

然后使用以下消息保存对象时ormlite崩溃:

java.lang.IllegalArgumentException: Field class com.myapp.venue.MyFieldClass for
    field FieldType:name=myField,class=ParentClass is not valid for type
    com.j256.ormlite.field.types.StringType@272ed83b, maybe should be
    class java.lang.String

如果我省略dataType规范,它不会崩溃。我可以以某种方式避免这种崩溃吗?在我看来,最好明确地指定类型。


阅读 363

收藏
2020-11-26

共1个答案

小编典典

因此,基本上,您的持久化器应以以下方式实现:

public class MyFieldClassPersister extends StringType {

    private static final MyFieldClassPersister INSTANCE = new MyFieldClassPersister();

    private MyFieldClassPersister() {
        super(SqlType.STRING, new Class<?>[] { MyFieldClass.class });
    }

    public static MyFieldClassPersister getSingleton() {
        return INSTANCE;
    }

    @Override
    public Object javaToSqlArg(FieldType fieldType, Object javaObject) {
        MyFieldClass myFieldClass = (MyFieldClass) javaObject;
        return myFieldClass != null ? getJsonFromMyFieldClass(myFieldClass) : null;
    }

    @Override
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) {
        return sqlArg != null ? getMyFieldClassFromJson((String) sqlArg) : null;
    }

    private String getJsonFromMyFieldClass(MyFieldClass myFieldClass) {
        // logic here
    }

    private MyFieldClass getMyFieldClassFromJson(String json) {
        // logic here
    }
}

您应该在onCreate您的OrmLiteSqliteOpenHelper课堂方法中注册它

    @Override
    public void onCreate(SQLiteDatabaseHolder holder, ConnectionSource connectionSource) {
            try {
                //...
                DataPersisterManager
                 .registerDataPersisters(MyFieldClassPersister.getSingleton());
            } catch (SQLException e) {
                // log exception
            }
    }

然后可以在模型中使用它,如下所示:

@DatabaseField(persisterClass = MyFieldClassPersister.class, columnName = "column_name")
protected MyFieldClass myFieldClass;
2020-11-26