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

我想将一些类型为ParentClass的字段作为json字符串存储到我的数据库中。 我不想使用Serializable接口和DataType.SERIALIZABLE,因为它与序列化类的完整类名绑定。

所以我使用以下代码:

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

persister类的一种:

 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. 如果我将自定义字段类型标记为字符串类型:

     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规范,它不会崩溃。 我能以某种方式避免这种崩溃吗? 在我看来,明确指定类型更好。

所以基本上你的persister应该以下一个方式实现:

 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 } } 

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

  @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; 

不要在onCreate()方法中注册persister适配器。 只有在首次创建数据库时才会调用此方法。 您应该将其添加到其他位置,例如构造函数或onOpen()方法。