Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

序列化- Flutter SDK

在此页面上

  • 支持序列化的数据类型
  • 序列化Realm对象
  • 序列EJSON
  • 从EJSON反序列化
  • 序列化非 Realm 对象
  • 注册自定义编解码器

适用于 Flutter 的Atlas Device SDK支持将扩展JSON (EJSON)与静态Realm对象进行序列化和反序列化。

Flutter SDK目前支持以下数据类型的序列化:

  • 所有 Dart 语言数据类型

  • 除 Decimal 128和 RealmValue 之外的所有 Realm 特定数据类型

下表通过输出示例说明了 SDK 的特定 Realm 数据类型如何进行序列化:

Realm类型
序列化到
日期时间

Date

DateTime birthDate = DateTime.utc(2024, 4, 10) 序列化为 birthDate: {$date: {$numberLong: 1712707200000}}

RealmList

阵列

List<String> listOfStrings = [food, water] 序列化为 listOfStrings: [food, water]

RealmMap

阵列

Map<String, int> mapOfMixedAnyValues = {'first': 123 , 'second': 567} 序列化为 mapOfValues: {first: {$numberInt: 123}, second: {$numberInt: 567}}

RealmSet

阵列

Set<int> setOfInts = {0, 1, 2, 3} 序列化为 setOfInts: [{$numberInt: 0}, {$numberInt: 1}, {$numberInt: 2}, {$numberInt: 3}]

ObjectId

ObjectId

ObjectId id = ObjectId() 序列化为 {id: {$oid: 666a6fd54978af08e54a8d52}

UUID

二进制文件

Uuid myId = Uuid.v4() 序列化为 myId: {$binary: {base64: 6TvsMWxDRWa1jSC6gxiM3A==, subType: 04}}

Uint8List

二进制文件

Uint8List aBinaryProperty = Uint8List.fromList([1, 2]) 序列化为 aBinaryProperty: {$binary: {base64: AQI=, subType: 00}}

对象

文档

Address address = Address("500 Dean Street", "Brooklyn", "NY", "USA") 序列化为 address: {street: 500 Dean Street, city: Brooklyn, state: NY, country: USA}

有关非 Realm 特定类型序列化的更多信息,请参阅BSON数据类型和关联表示形式。

Flutter SDK序列化目前不支持以下BSON types :Code、CodeWScope、DBPointer、DBRef、正则表达式和 Timestamp。

SDK 的全文档编码器使您能够序列化和反序列化用户定义的类。

要使用编码器,请像平常使用@RealmModel()注解一样创建对象模型。 由part声明创建的RealmObject类模型提供了序列化和反序列化所需的方法。

本页的示例将使用以下Pet对象模型:

import 'package:realm_dart/realm.dart';
part 'pet.realm.dart';
@RealmModel()
class _Pet {
late String type;
late int numberOfLegs;
late DateTime birthDate;
late double? price;
}

对于基于RealmObject 类的对象,您可以使用 toEjson() 序列化为EJSON 方法可通过以下两种方式实现:

// Pass the object as a parameter to the method
EJsonValue serializeByParam = toEJson(spider);
// Call the method directly on the object
EJsonValue serializeWithCall = spider.toEJson();
{
type: Jumping Spider,
numberOfLegs: {$numberInt: 8},
birthDate: {$date: {$numberLong: 1712707200000}},
price: null
}

使用 fromEjson() 从EJSON反序列化 方法。该方法将指定对象类型的EJSON作为输入,并输出指定对象类型的反序列化实例。

以下示例对上一示例中的serializeByParam进行反序列化:

// Pass the serialized object to the method
final deserializeFromEjsonWithExplicitType = fromEJson<Pet>(serializeByParam);
// The method can also infer the object type
Pet deserializeFromEjson = fromEJson(serializeByParam);

对于非 Realm 类,您可以在类构造函数上使用@ejson注解来生成解码器和编码器:

class Person {
final String name;
final DateTime birthDate;
final int? age;
final double income;
final Person? spouse;
@ejson // annotate constructor to generate decoder and encoder
Person(this.name, this.birthDate, this.income, {this.spouse, this.age});
}

该 SDK 还支持自定义EJSON编解码器。 要在您的应用中使用它们,请 注册 指定类型的自定义EJSON编码器和解码器。

后退

冻结数据