【发布时间】:2015-04-19 17:41:14
【问题描述】:
我想将一些 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
}
}
这是我遇到的两个问题:
我不知道如何指定从对象到字符串的自定义转换。似乎 ORMLite 调用 Object.toString() 以获取对象的字符串表示形式。在 Persister 中有一些方法会很棒,我可以在其中指定如何将 Object 转换为字符串(在我的情况下为 json)。是的,我可以在 MyFieldClass 中重写 toString() 方法,但是在 Persister 中进行转换更方便。是否有任何方法可以重写以指定从模型对象到 db-object 的转换?
-
如果我将自定义字段类型标记为字符串类型:
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 规范,它不会崩溃。我可以以某种方式避免这种崩溃吗?在我看来,最好明确指定类型。
【问题讨论】:
-
是的,ORMLite 没有做
toString()。是StringType正在这样做。您还需要重写并实现javaToSqlArg(...)方法。
标签: java json serialization ormlite