Save and restore objects flexibly.
This can serialize and de-serialize objects to multiple different formats. It is most useful if you have Dart on both ends, rather than needing to communicate with an external system. It can handle cycles, inheritance, getters and setters, private or final fields set via constructors, objects serialized in different ways at different times, and other complex options. It can handle serializing acyclic objects with only public fields to a simple JSON format, but might be more heavyweight than is necessary if that's the only requirement.
This has no privileged access to object representations, so objects are accessed and created according to their public APIs. As a result, serializations from older versions where the internal representation has changed can still be read as long as the public API is still available.
The way an object's state is read and written is defined by SerializationRules. These can be implemented in various ways. The easiest to use is using mirrors to find the members. Rules can also be hand-written or, for relatively simple classes, generated using a transformer.
depending on whether or not you want the mirrored rules. These are more convenient, but cause increased code size in dartj2s.
To use the transformer, include something in the pubspec like
transformers: - serialization : $include: ["lib/stuff.dart", "lib/more_stuff.dart"]
Then, set up the generated rules in a Serialization instance, and then call
write(). The serialization rules will be named as
the name of the model file with
_serialization_rules appended to it,
so in the case of
the same directory as the original.
Normally you won't ever see these files, because the
transformer creates it on the fly and it is sent directly to pub serve
or to dart2js without ever being written to disk.
To see the generated code, run pub build in debug mode, e.g.
if there is a program in the package's
bin directory to run something
using these files, then
pub build --mode=debug bin
would generate the code for that, and also log which files were generated, in the form
Generated serialization rules in my_package|lib/stuff_serialization_rules.dart
It's also possible to run the transformer's code outside of the transformer, which is helpful for debugging or to use the code in a different way. See the `test/transformer/generate_standalone.dart' for an example of that.
The bin directory code would look something like.
import 'package:my_package/stuff_serialization_rules.dart' as foo; ... var serialization = new Serialization(); foo.rules.values.forEach(serialization.addRule); ... sendToClient(serialization.write(somePerson));
and on the client, do something like
p = readFromServer(personId).then((data) => serialization.read(data));
Alternatively, if using the mirrored rules, just tell the serialization which classes might be serialized.
var serialization = new Serialization() ..addRuleFor(Person); ..addRuleFor(Address); serialization.write(address);
For more concrete examples, see the
test directory, and particularly
for examples of the transformer it may be useful to look at the
pubspec.yaml for this package, and the
This is not an official Google project.
Clean up setup for serialization. Adds
defaultFormat, and a named
format parameter to
the constructors to set
Improved the README.
Fixes for transformer when generating maps, test that option properly.
Add this to your package's pubspec.yaml file:
dependencies: serialization: "^0.10.4+4"
You can install packages from the command line:
$ pub get
$ flutter packages get
Alternatively, your editor might support
pub get or
flutter packages get.
Check the docs for your editor to learn more.
Now in your Dart code, you can use:
|0.10.4+4||Feb 3, 2016|
|0.10.4+3||Jan 29, 2016|
|0.10.4+2||Nov 2, 2015|
|0.10.4||Jan 26, 2015|
|0.10.3||Oct 31, 2014|
|0.10.2||Oct 21, 2014|
|0.10.1||Oct 15, 2014|
|0.10.0||Sep 19, 2014|
|0.9.1+1||Jul 23, 2014|
|0.9.1||Dec 19, 2013|
We analyzed this package on Jul 17, 2018, and provided a score, details, and suggestions below. Analysis was completed with status completed using:
Describes how popular the package is relative to other packages. [more]
Code health derived from static analysis. [more]
Reflects how tidy and up-to-date the package is. [more]
Weighted score of the above. [more]
Detected platforms: Flutter, web, other
No platform restriction found in primary library
dartdocruns without any issues.
Package is too old.
The package was released more than two years ago.
Fix analysis and formatting issues.
Analysis or formatting checks reported 17 errors 16 hints.
Strong-mode analysis of
lib/serialization_mirrors.dartfailed with the following error:
line: 131 col: 3
Invalid override. The type of 'MirrorRule.nameFor' ('(DeclarationMirror, Writer) → String') isn't a subtype of 'NamedObjectRule.nameFor' ('(dynamic, Writer) → String').
Strong-mode analysis of
lib/src/format.dartfailed with the following error:
line: 74 col: 3
Invalid override. The type of 'InternalMapFormat.read' ('(Map<String, dynamic>, Reader) → Map<String, dynamic>') isn't a subtype of 'Format.read' ('(dynamic, Reader) → Map<String, dynamic>').
Similar analysis of the following files failed:
The description is too short.
Add more detail about the package, what it does and what is its target use case. Try to write at least 60 characters.
Package is pre-v1 release.
While there is nothing inherently wrong with versions of
0.*.*, it usually means that the author is still experimenting with the general direction API.
Maintain an example.
Create a short demo in the
example/directory to show how to use this package. Common file name patterns include:
example.dartor you could also use
|Dart SDK||>=1.0.0 <2.0.0|