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

2023-12-01

我想将 ParentClass 类型的一些字段作为 json 字符串存储到我的数据库中。我不想使用 Serialized 接口和 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 中有一些方法可以指定如何将对象转换为字符串(在我的例子中为 json),那就太好了。是的,我可以重写 MyFieldClass 中的 toString() 方法,但在 Persister 中执行转换更方便。是否有任何我可以重写的方法来指定从模型对象到数据库对象的转换?

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


所以基本上你的持久化器应该以下面的方式实现:

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 class

    @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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在ORMLite中指定对象自定义序列化? 的相关文章

随机推荐

  • Rails:找不到railties

    rvm v rvm 1 10 2 by Wayne E Seguin lt email protected gt Michal Papis lt email protected gt https rvm beginrescueend com
  • C++的recv()问题

    我想发送一个字符串 Hello there 但我只收到 re 这是为什么 void Accept SOCKADDR IN sock int intsock sizeof sock remoteSocket accept desc LPSOC
  • Vuejs 3如何将变量传递给槽内的所有元素

    我正在使用 VueJs 3 创建一个动态表组件 其中涉及将循环索引变量发送到插槽内的所有子组件 组件的用法如下
  • 无法加载从带有标识符的包中的笔尖引用的图像

    如果需要复制项目 gt 完成 区分大小写 gt 已注意 图像位于项目文件夹内 这里可能有什么问题 Xcode 版本 9 0 我通过将图像导入资产 Assets xcassets 并从那里引用它来解决这个问题 看起来 Xcode 9 中的构建
  • 如何切换浏览器操作的操作?

    我已经创建了我的第一个 chrome 扩展 它将事件处理程序添加到单击时页面上的所有锚元素 如果用户第二次单击该图标 事件处理程序将重新附加到锚元素并执行两次 我需要以下内容 单击浏览器操作 将事件添加到锚元素 如果可能 请在浏览器操作图标
  • 时间:2019-03-17 标签:c#webrequestpostimagetowebapi

    我在将图像上传到我正在运行的 Web API 时遇到问题 使用 GET 请求时 我可以从 Web API 检索数据 但在处理 POST 请求时遇到问题 我需要将 BMP 图像上传到 Web API 然后发回 json 字符串 HttpPos
  • 如何使用 Google Chrome 扩展更改所选文本的 CSS

    我正在为 Chrome 浏览器制作一个扩展 它使用 contextMenus 来更改所选文本的 CSS 但我无法访问 HTML 结构 即所选文本的父节点 就像在本示例中可以轻松做到的那样 var selection window getSe
  • Instagram ?__a=1 url 不再工作 & graphql/query 获取数据的问题

    4 月 19 日更新 使用cookie几天后ig pr前两天是块 看起来现在获取数据的唯一方法是使用sessionid具有特定值 Original 我正在使用 instagram a 1 url 来阅读 Instagram 用户的所有帖子
  • MySQL:将大表拆分为小表的最快方法

    我有一个非常大的表 其中有近 3 亿条记录 由于 select 查询对我来说太慢了 所以我想将其拆分为大约 800 个小表 数据集如下所示 XXXXXX column2 column3 column4 XXXXXX column2 colu
  • max 的匿名/Lambda 函数

    我正在尝试编写一个单行函数 您可以在其中输入一个数字和一个列表 然后它返回最高值 例如 Input getMax 5 1 4 7 Output 7 这是我当前的代码 getMax Ord a gt a gt a gt a getMax f
  • Scala 类型证据

    在scala源代码中我可以看到这段代码 implicitNotFound msg Cannot prove that From lt lt To sealed abstract class lt lt From To extends Fro
  • Realm 在 android 中进行 IN 查询

    是否可以在 android 中使用 Realm 进行 IN 查询 我的意思是 执行相当于 SELECT X FROM X WHERE x IN 预先非常感谢您 官方IN运算符 自 1 2 0 起 的工作方式如下 public RealmQu
  • 如何在Netbeans IDE之外运行数据库程序?

    我对数据库真的很陌生 这是我使用 java Netbeans 7 1 的第一个数据库程序 现在我们国家是夏天 我是 I T 课程的学生 我们关于编程的下一个主题是关于数据库的 因为没有课程 所以我花时间学习数据库 为下个学期做准备 我将此网
  • 使用 PropSheetLook_OneNoteTabs 样式动态调整 CMFCPropertySheet 大小

    我正在尝试动态调整大小CMFCPropertySheet在每个页面的底部添加自定义控件 由于所有属性页的高度并不相同 因此我有一种机制可以在必要时增加尺寸 为此 我已经重写了OnActivatePage方法并通过使用SetWindowPos
  • 如何将 CSS AnimationEnd 事件处理程序添加到 GWT 小部件?

    我希望我的 GWT 小部件在其CSS动画结束了 在纯 HTML Javascript 中 这可以通过注册事件处理程序轻松完成 如下所示 elem addEventListener webkitAnimationEnd function do
  • 与路由器的发送状态未定义

    我有一个组件 它使用路由器导航到另一个带有布尔变量的组件 如下所示 this router navigate consume course this id state isFirst replaceUrl true 在另一个组件中 我试图像
  • Excel 中令人困惑的 VBA 注释插入行为

    我要重写这个请求 我发现我可以更清楚 在电子表格中 我突出显示要在其中插入标准化注释的单元格 我使用键盘快捷键来激活AddServiceNote并且代码插入具有标准化格式和文本的注释 一切都有效 但不可重复 我无法选择另一个单元格并使用相同
  • 当我通过 Git Bash 中的 ssh 在远程 Linux 计算机上运行命令时,如何将文件内容直接复制到 Windows 剪贴板中?

    我使用的是 Windows 10 我打开 Git Bash 然后通过 ssh 进入 Ubuntu 服务器 我经常想复制一个大文本文件的全部内容 有时我宁愿快速将内容复制到剪贴板 而不是使用 scp 将文件下载到我的 Windows 计算机
  • ntdll.dll [下面的帧可能不正确/丢失,没有为 ntdll.dll 加载符号]

    几周以来我遇到了这种情况 这非常令人沮丧 我的程序调试得很好 没有错误 当我运行程序时 它执行了初始部分 工作 几秒钟后它终止于 中断继续 选项 当我查看调用堆栈时 发现它是来自 ntdll dll 和 msvcr100d dll 的错误
  • 如何在ORMLite中指定对象自定义序列化?

    我想将 ParentClass 类型的一些字段作为 json 字符串存储到我的数据库中 我不想使用 Serialized 接口和 DataType SERIALIZABLE 因为它与序列化类的完整类名相关 所以我使用以下代码 class P