你有这个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()
);