Для этого у вас есть пакет built_value .
С его помощью вы можете сериализовать и десериализовать объекты.
Сначала вам необходимо объявить объект:
part 'foo.g.dart';
abstract class Foo
implements Built<Foo, FooBuilder>{
static Serializer<Foo> get serializer => _$fooSerializer;
String get fooValue;
@nullable int get creationDate;
Foo._();
factory Foo([updates(FooBuilder b)]) = _$Foo;
}
Все объекты должны будут следовать этой модели фрейма: - Быть абстрактным классом, реализующим Built
- Объявление значения static
Serializer
getter - Объявление _()
- Объявление factory
-Объявление .part
вверху, чтобы мы могли сгенерировать файл модели
Я рекомендую вам скопировать класс и изменить только имена и модель.
Затем, если вы хотитечтобы его сериализовать, вам нужно создать Serializer
класс
import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
part 'serializers.g.dart';
@SerializersFor(const [
Foo // declare here all the classes to be serialized
])
Serializers serializers = _$serializers;
Serializers standardSerializers =
(serializers.toBuilder()
..add(CustomDateTimeSerializer()) // delcare here custom plugins
..addPlugin(StandardJsonPlugin())
).build();
}
В качестве бонуса я опубликую здесь специальный сериализатор для значений времени:
/// Serializer for [DateTime] using Milliseconds instead of MicroSeconds
///
/// An exception will be thrown on attempt to serialize local DateTime
/// instances; you must use UTC.
class CustomDateTimeSerializer implements PrimitiveSerializer<DateTime> {
final bool structured = false;
@override
final Iterable<Type> types = new BuiltList<Type>([DateTime]);
@override
final String wireName = 'DateTime';
@override
Object serialize(Serializers serializers, DateTime dateTime,
{FullType specifiedType = FullType.unspecified}) {
if (!dateTime.isUtc) {
throw new ArgumentError.value(
dateTime, 'dateTime', 'Must be in utc for serialization.');
}
return dateTime.microsecondsSinceEpoch / 1000;
}
@override
DateTime deserialize(Serializers serializers, Object serialized,
{FullType specifiedType = FullType.unspecified}) {
final microsecondsSinceEpoch = serialized as int;
return new DateTime.fromMicrosecondsSinceEpoch(microsecondsSinceEpoch * 1000 * 1000,
isUtc: true);
}
}
После этогообязательно запустите следующее в терминале, в корне папки вашего проекта:
flutter packages pub run build_runner watch
Журнал поможет вам найти ошибки, которые есть в вашем коде.
Тогда вы будетеесть файлы .g
для каждой модели.
Теперь вы можете сериизмените объект с помощью:
import 'dart:convert' as json;
//...
var jsonEncoded = json.jsonEncode(standardSerializers.serializeWith(Foo.serializer, foo));
Бонусный совет: это также может быть использовано для построения вашего объекта:
var foo = Foo((b) => b
..fooValue = "foo"
..creationDate = DateTime.now()
);