Flutter:如何将ObjectBox对象作为其他ObjectBox对象的字段序列化?
ObjectBox实体类关联序列化问题解决
问题场景
我定义了两个ObjectBox实体类:
@Entity() class TestModel1 { @Id() int id; final TestModel2 testModel2; // 无法序列化 TestModel1({this.id = 0, required this.testModel2,}); } @Entity() class TestModel2 { @Id() int id; final String test1; final int test2; TestModel2({this.id = 0, required this.test1, required this.test2}); }
需求是把TestModel2作为TestModel1的字段进行序列化,但目前报错:
Cannot use the default constructor of 'TestModel1': don't know how to initialize param testModel2 - no such property.
想请教有没有支持这类特殊类型序列化的注解,还是只能用JSON转换?
解决方案
ObjectBox本身不支持直接将另一个实体类作为字段嵌入序列化,你需要用关系注解处理实体间关联,或用JSON嵌套存储,具体两种方案如下:
1. 使用@ToOne注解(一对一关联)
如果TestModel1和TestModel2是一对一关系,这是ObjectBox官方推荐的实体关联方式,修改TestModel1代码:
@Entity() class TestModel1 { @Id() int id; // 使用@ToOne关联TestModel2实体 final ToOne<TestModel2> testModel2; // 构造函数中初始化ToOne对象 TestModel1({this.id = 0, ToOne<TestModel2>? testModel2}) : testModel2 = testModel2 ?? ToOne<TestModel2>(); }
使用时通过testModel2.target操作关联对象:
// 存储关联对象 final test2 = TestModel2(test1: "demo", test2: 456); await testModel2Box.put(test2); final test1 = TestModel1(); test1.testModel2.target = test2; await testModel1Box.put(test1); // 获取关联对象 final fetchedTest1 = testModel1Box.get(test1.id)!; final fetchedTest2 = fetchedTest1.testModel2.target;
2. JSON嵌套存储(无需独立存储TestModel2)
如果TestModel2不需要作为独立实体存储,仅作为TestModel1的嵌套数据,可以用JSON序列化实现:
- 依赖
json_annotation、json_serializable包生成序列化代码 - 在
TestModel1中用字符串存储TestModel2的JSON数据,通过getter/setter转换对象:
@Entity() class TestModel1 { @Id() int id; String _testModel2Json; // 对外暴露对象的getter/setter TestModel2 get testModel2 => TestModel2.fromJson(jsonDecode(_testModel2Json)); set testModel2(TestModel2 value) => _testModel2Json = jsonEncode(value.toJson()); TestModel1({this.id = 0, required TestModel2 testModel2}) : _testModel2Json = jsonEncode(testModel2.toJson()); }
方案对比
- 实体关联:基于数据库外键,支持独立操作关联实体,可通过关联查询数据,适合需要分开管理两个实体的场景
- JSON嵌套:仅作为主实体的一部分存储,无法直接查询嵌套字段,适合无需单独操作嵌套对象的简单场景
内容的提问来源于stack exchange,提问作者Preem Palver2
相关产品推荐
相关产品推荐

