diff --git a/built_json/lib/built_json.dart b/built_json/lib/built_json.dart index 10a463a..b10c6d5 100644 --- a/built_json/lib/built_json.dart +++ b/built_json/lib/built_json.dart @@ -42,6 +42,8 @@ abstract class Serializers { /// [genericType] will be needed to deserialize. /// /// Create one using [SerializersBuilder]. + /// + /// TODO(davidmorgan): document the wire format. Object serialize(Object object, {GenericType genericType: const GenericType()}); @@ -84,9 +86,9 @@ class GenericType { final Type root; /// Type parameters of the type. - final List leaves; + final List parameters; - const GenericType([this.root = Object, this.leaves = const []]); + const GenericType([this.root = Object, this.parameters = const []]); bool get isObject => root == Object; } @@ -103,7 +105,9 @@ abstract class Serializer { /// The [Type]s that can be serialized. /// - /// They must all be equal to T or subclasses of T. + /// They must all be equal to T or a subclass of T. Subclasses are used when + /// T is an abstract class, which is the case with built_value generated + /// serializers. Iterable get types; /// The wire name of the serializable type. For most classes, the class name. @@ -115,6 +119,8 @@ abstract class Serializer { /// /// Use [serializers] as needed for nested serialization. Information about /// the type being serialized is provided in [genericType]. + /// + /// TODO(davidmorgan): document the wire format. Object serialize(Serializers serializers, T object, {GenericType genericType: const GenericType()}); diff --git a/built_json/lib/src/built_json_serializers.dart b/built_json/lib/src/built_json_serializers.dart index 31ff4af..70ca894 100644 --- a/built_json/lib/src/built_json_serializers.dart +++ b/built_json/lib/src/built_json_serializers.dart @@ -10,7 +10,6 @@ class BuiltJsonSerializers implements Serializers { final BuiltMap _typeToSerializer; final BuiltMap _wireNameToSerializer; final BuiltMap _typeNameToSerializer; - final BuiltMap _builderFactories; BuiltJsonSerializers._(this._typeToSerializer, this._wireNameToSerializer, @@ -48,8 +47,9 @@ class BuiltJsonSerializers implements Serializers { final wireName = (object as List).first; final serializer = _wireNameToSerializer[wireName]; - if (serializer == - null) throw new StateError("No serializer for '${wireName}'."); + if (serializer == null) { + throw new StateError("No serializer for '${wireName}'."); + } final json = serializer.structured ? (object as List).sublist(1) : (object as List)[1]; @@ -78,7 +78,7 @@ class BuiltJsonSerializers implements Serializers { } Serializer _getSerializerByType(Type type) { - return _typeToSerializer[type] ?? _typeNameToSerializer[_getName(type)]; + return _typeToSerializer[type] ?? _typeNameToSerializer[_getRawName(type)]; } } @@ -106,7 +106,7 @@ class BuiltJsonSerializersBuilder implements SerializersBuilder { _wireNameToSerializer[serializer.wireName] = serializer; for (final type in serializer.types) { _typeToSerializer[type] = serializer; - _typeNameToSerializer[_getName(type)] = serializer; + _typeNameToSerializer[_getRawName(type)] = serializer; } } @@ -123,9 +123,8 @@ class BuiltJsonSerializersBuilder implements SerializersBuilder { } } -String _getName(Type type) => _makeRaw(type.toString()); - -String _makeRaw(String name) { +String _getRawName(Type type) { + final name = type.toString(); final genericsStart = name.indexOf('<'); return genericsStart == -1 ? name : name.substring(0, genericsStart); } diff --git a/built_json/lib/src/built_list_serializer.dart b/built_json/lib/src/built_list_serializer.dart index 3efa995..2e18e9e 100644 --- a/built_json/lib/src/built_list_serializer.dart +++ b/built_json/lib/src/built_list_serializer.dart @@ -13,9 +13,9 @@ class BuiltListSerializer implements Serializer { @override Object serialize(Serializers serializers, BuiltList object, {GenericType genericType: const GenericType()}) { - final valueGenericType = genericType.leaves.isEmpty + final valueGenericType = genericType.parameters.isEmpty ? const GenericType() - : genericType.leaves[0]; + : genericType.parameters[0]; return object.map( (item) => serializers.serialize(item, genericType: valueGenericType)); @@ -24,9 +24,9 @@ class BuiltListSerializer implements Serializer { @override BuiltList deserialize(Serializers serializers, Object object, {GenericType genericType: const GenericType()}) { - final valueGenericType = genericType.leaves.isEmpty + final valueGenericType = genericType.parameters.isEmpty ? const GenericType() - : genericType.leaves[0]; + : genericType.parameters[0]; final result = serializers.newBuilder(genericType) as ListBuilder ?? new ListBuilder(); diff --git a/built_json/lib/src/built_map_serializer.dart b/built_json/lib/src/built_map_serializer.dart index ec9b91b..ef0f8a2 100644 --- a/built_json/lib/src/built_map_serializer.dart +++ b/built_json/lib/src/built_map_serializer.dart @@ -13,12 +13,12 @@ class BuiltMapSerializer implements Serializer { @override Object serialize(Serializers serializers, BuiltMap object, {GenericType genericType: const GenericType()}) { - final keyTypes = genericType.leaves.isEmpty + final keyTypes = genericType.parameters.isEmpty ? const GenericType() - : genericType.leaves[0]; - final valueTypes = genericType.leaves.isEmpty + : genericType.parameters[0]; + final valueTypes = genericType.parameters.isEmpty ? const GenericType() - : genericType.leaves[1]; + : genericType.parameters[1]; final result = []; for (final key in object.keys) { @@ -32,12 +32,12 @@ class BuiltMapSerializer implements Serializer { @override BuiltMap deserialize(Serializers serializers, Object object, {GenericType genericType: const GenericType()}) { - final keyTypes = genericType.leaves.isEmpty + final keyTypes = genericType.parameters.isEmpty ? const GenericType() - : genericType.leaves[0]; - final valueTypes = genericType.leaves.isEmpty + : genericType.parameters[0]; + final valueTypes = genericType.parameters.isEmpty ? const GenericType() - : genericType.leaves[1]; + : genericType.parameters[1]; final result = serializers.newBuilder(genericType) as MapBuilder ?? new MapBuilder(); diff --git a/built_json/lib/src/built_set_serializer.dart b/built_json/lib/src/built_set_serializer.dart index 0174c4a..9df5766 100644 --- a/built_json/lib/src/built_set_serializer.dart +++ b/built_json/lib/src/built_set_serializer.dart @@ -13,9 +13,9 @@ class BuiltSetSerializer implements Serializer { @override Object serialize(Serializers serializers, BuiltSet object, {GenericType genericType: const GenericType()}) { - final valueGenericType = genericType.leaves.isEmpty + final valueGenericType = genericType.parameters.isEmpty ? const GenericType() - : genericType.leaves[0]; + : genericType.parameters[0]; return object.map( (item) => serializers.serialize(item, genericType: valueGenericType)); @@ -24,9 +24,9 @@ class BuiltSetSerializer implements Serializer { @override BuiltSet deserialize(Serializers serializers, Object object, {GenericType genericType: const GenericType()}) { - final valueGenericType = genericType.leaves.isEmpty + final valueGenericType = genericType.parameters.isEmpty ? const GenericType() - : genericType.leaves[0]; + : genericType.parameters[0]; final result = serializers.newBuilder(genericType) as SetBuilder ?? new SetBuilder(); diff --git a/example/lib/compound_value.dart b/example/lib/compound_value.dart index bea3ace..8a39d12 100644 --- a/example/lib/compound_value.dart +++ b/example/lib/compound_value.dart @@ -11,13 +11,6 @@ import 'package:example/test_enum.dart'; part 'compound_value.g.dart'; -/// Example of how to use built_json. -/// -/// Declare a top level [Serializers] field called -/// serializers. The built_json code generator will provide the -/// implementation. You usually only need to do this once per project. -Serializers serializers = _$serializers; - /// Example built_value type. abstract class CompoundValue implements Built { diff --git a/example/lib/compound_value.g.dart b/example/lib/compound_value.g.dart index 5dce8e2..f3a76ff 100644 --- a/example/lib/compound_value.g.dart +++ b/example/lib/compound_value.g.dart @@ -1,5 +1,5 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// 2015-12-08T16:15:17.813Z +// 2016-01-05T16:23:30.833Z part of compound_value; @@ -8,10 +8,6 @@ part of compound_value; // Target: library compound_value // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(TestEnum.serializer) - ..add(CompoundValue.serializer) - ..add(Value.serializer)).build(); Serializer _$compoundValueSerializer = new _$CompoundValueSerializer(); diff --git a/example/lib/serializers.dart b/example/lib/serializers.dart new file mode 100644 index 0000000..07a96d2 --- /dev/null +++ b/example/lib/serializers.dart @@ -0,0 +1,19 @@ +// Copyright (c) 2015, Google Inc. Please see the AUTHORS file for details. +// All rights reserved. Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +library serializers; + +import 'package:built_json/built_json.dart'; +import 'package:example/test_enum.dart'; +import 'package:example/value.dart'; +import 'package:example/compound_value.dart'; + +part 'serializers.g.dart'; + +/// Example of how to use built_json. +/// +/// Declare a top level [Serializers] field called +/// serializers. The built_json code generator will provide the +/// implementation. You usually only need to do this once per project. +Serializers serializers = _$serializers; diff --git a/example/lib/serializers.g.dart b/example/lib/serializers.g.dart new file mode 100644 index 0000000..76ade0e --- /dev/null +++ b/example/lib/serializers.g.dart @@ -0,0 +1,15 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 2016-01-05T16:23:30.818Z + +part of serializers; + +// ************************************************************************** +// Generator: BuiltJsonGenerator +// Target: library serializers +// ************************************************************************** + +Serializers _$serializers = (new Serializers().toBuilder() + ..add(TestEnum.serializer) + ..add(Value.serializer) + ..add(CompoundValue.serializer)) + .build(); diff --git a/example/lib/test_enum.dart b/example/lib/test_enum.dart index feebddf..253c2ee 100644 --- a/example/lib/test_enum.dart +++ b/example/lib/test_enum.dart @@ -11,13 +11,6 @@ import 'package:example/value.dart'; part 'test_enum.g.dart'; -/// Example of how to use built_json. -/// -/// Declare a top level [Serializers] field called -/// serializers. The built_json code generator will provide the -/// implementation. You usually only need to do this once per project. -Serializers serializers = _$serializers; - /// Example [EnumClass]. class TestEnum extends EnumClass { /// Example of how to make an [EnumClass] serializable. diff --git a/example/lib/test_enum.g.dart b/example/lib/test_enum.g.dart index 618b539..a8a972f 100644 --- a/example/lib/test_enum.g.dart +++ b/example/lib/test_enum.g.dart @@ -1,5 +1,5 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// 2015-12-08T16:56:15.642Z +// 2016-01-05T16:23:30.760Z part of test_enum; @@ -8,10 +8,6 @@ part of test_enum; // Target: library test_enum // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(TestEnum.serializer) - ..add(Value.serializer) - ..add(CompoundValue.serializer)).build(); Serializer _$testEnumSerializer = new _$TestEnumSerializer(); class _$TestEnumSerializer implements Serializer { diff --git a/example/lib/value.dart b/example/lib/value.dart index 01e7293..7a6566a 100644 --- a/example/lib/value.dart +++ b/example/lib/value.dart @@ -12,13 +12,6 @@ import 'package:example/test_enum.dart'; part 'value.g.dart'; -/// Example of how to use built_json. -/// -/// Declare a top level [Serializers] field called -/// serializers. The built_json code generator will provide the -/// implementation. You usually only need to do this once per project. -Serializers serializers = _$serializers; - /// Example built_value type. abstract class Value implements Built { /// Example of how to make a built_value type serializable. diff --git a/example/lib/value.g.dart b/example/lib/value.g.dart index fd9cff8..f0e62a9 100644 --- a/example/lib/value.g.dart +++ b/example/lib/value.g.dart @@ -1,5 +1,5 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// 2015-12-08T16:15:17.773Z +// 2016-01-05T16:23:30.814Z part of value; @@ -8,10 +8,6 @@ part of value; // Target: library value // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(TestEnum.serializer) - ..add(CompoundValue.serializer) - ..add(Value.serializer)).build(); Serializer _$valueSerializer = new _$ValueSerializer(); class _$ValueSerializer implements Serializer { diff --git a/example/test/compound_value_test.dart b/example/test/compound_value_test.dart index ee68e32..99cdea1 100644 --- a/example/test/compound_value_test.dart +++ b/example/test/compound_value_test.dart @@ -3,47 +3,42 @@ // license that can be found in the LICENSE file. import 'package:example/compound_value.dart'; -import 'package:example/test_enum.dart' hide serializers; +import 'package:example/serializers.dart'; +import 'package:example/test_enum.dart'; import 'package:test/test.dart'; void main() { - group('Value', () { - test('can be serialized', () { - final compoundValue = new CompoundValue((b) => b - ..aValue.anInt = 1 - ..aValue.aString = 'two' - ..aValue.anObject = 3 - ..aTestEnum = TestEnum.no); + group('CompoundValue', () { + final data = new CompoundValue((b) => b + ..aValue.anInt = 1 + ..aValue.aString = 'two' + ..aValue.anObject = 3 + ..aTestEnum = TestEnum.no); + final serialized = [ + 'CompoundValue', + 'aValue', + [ + 'anInt', + 1, + 'aString', + 'two', + 'anObject', + ['int', 3], + 'aDefaultInt', + 7, + 'listOfInt', + [], + ], + 'aTestEnum', + 'no', + ]; - expect(serializers.serialize(compoundValue), [ - 'CompoundValue', - 'aValue', - [ - 'anInt', - 1, - 'aString', - 'two', - 'anObject', - ['int', 3], - 'aDefaultInt', - 7, - 'listOfInt', - [], - ], - 'aTestEnum', - 'no', - ]); + test('can be serialized', () { + expect(serializers.serialize(data), serialized); }); test('can be deserialized', () { - final compoundValue = new CompoundValue((b) => b - ..aValue.anInt = 1 - ..aValue.aString = 'two' - ..aValue.anObject = 3 - ..aTestEnum = TestEnum.no); - - expect(serializers.deserialize(serializers.serialize(compoundValue)), - compoundValue); + expect(serializers.deserialize(serialized), data); }); }); } diff --git a/example/test/test_enum_test.dart b/example/test/test_enum_test.dart index d875fd4..5737c56 100644 --- a/example/test/test_enum_test.dart +++ b/example/test/test_enum_test.dart @@ -2,18 +2,21 @@ // All rights reserved. Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +import 'package:example/serializers.dart'; import 'package:example/test_enum.dart'; import 'package:test/test.dart'; void main() { group('TestEnum', () { + final data = TestEnum.yes; + final serialized = ['TestEnum', 'yes']; + test('can be serialized', () { - expect(serializers.serialize(TestEnum.yes), ['TestEnum', 'yes']); + expect(serializers.serialize(data), serialized); }); test('can be deserialized', () { - expect(serializers.deserialize(serializers.serialize(TestEnum.maybe)), - TestEnum.maybe); + expect(serializers.deserialize(serialized), data); }); }); } diff --git a/example/test/value_test.dart b/example/test/value_test.dart index 4d1bc74..05e6896 100644 --- a/example/test/value_test.dart +++ b/example/test/value_test.dart @@ -2,6 +2,7 @@ // All rights reserved. Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +import 'package:example/serializers.dart'; import 'package:example/value.dart'; import 'package:test/test.dart';