11// Copyright (c) 2015, Google Inc. Please see the AUTHORS file for details.
2+
23// All rights reserved. Use of this source code is governed by a BSD-style
34// license that can be found in the LICENSE file.
45
@@ -8,8 +9,17 @@ import 'package:built_json/built_json.dart';
89/// Default implementation of [Serializers] .
910class BuiltJsonSerializers implements Serializers {
1011 final BuiltMap <Type , Serializer > _typeToSerializer;
12+
13+ // Implementation note: wire name is what gets sent in the JSON, type name is
14+ // the runtime type name. Type name is complicated for two reasons:
15+ //
16+ // 1. Built Value classes have two types, the abstract class and the
17+ // generated implementation.
18+ //
19+ // 2. When compiled to javascript the runtime type names are obfuscated.
1120 final BuiltMap <String , Serializer > _wireNameToSerializer;
1221 final BuiltMap <String , Serializer > _typeNameToSerializer;
22+
1323 final BuiltMap <FullType , Function > _builderFactories;
1424
1525 BuiltJsonSerializers ._(this ._typeToSerializer, this ._wireNameToSerializer,
@@ -20,23 +30,36 @@ class BuiltJsonSerializers implements Serializers {
2030 {FullType specifiedType: FullType .unspecified}) {
2131 if (specifiedType.isUnspecified) {
2232 final serializer = _getSerializerByType (object.runtimeType);
23- if (serializer == null ) throw new StateError (
24- "No serializer for '${object .runtimeType }'." );
25- final serialized = serializer.serialize (this , object);
26-
27- if (serializer.structured) {
33+ if (serializer == null ) {
34+ throw new StateError ("No serializer for '${object .runtimeType }'." );
35+ }
36+ if (serializer is StructuredSerializer ) {
2837 final result = < Object > [serializer.wireName];
29- return result..addAll (serialized as Iterable );
38+ return result..addAll (serializer.serialize (this , object));
39+ } else if (serializer is PrimitiveSerializer ) {
40+ return < Object > [
41+ serializer.wireName,
42+ serializer.serialize (this , object)
43+ ];
3044 } else {
31- return < Object > [serializer.wireName, serialized];
45+ throw new StateError (
46+ 'serializer must be StructuredSerializer or PrimitiveSerializer' );
3247 }
3348 } else {
3449 final serializer = _getSerializerByType (specifiedType.root);
35- if (serializer == null ) throw new StateError (
36- "No serializer for '${specifiedType .root }'." );
37- final result =
38- serializer.serialize (this , object, specifiedType: specifiedType);
39- return serializer.structured ? (result as Iterable ).toList () : result;
50+ if (serializer == null ) {
51+ throw new StateError ("No serializer for '${specifiedType .root }'." );
52+ }
53+ if (serializer is StructuredSerializer ) {
54+ return serializer
55+ .serialize (this , object, specifiedType: specifiedType)
56+ .toList ();
57+ } else if (serializer is PrimitiveSerializer ) {
58+ return serializer.serialize (this , object, specifiedType: specifiedType);
59+ } else {
60+ throw new StateError (
61+ 'serializer must be StructuredSerializer or PrimitiveSerializer' );
62+ }
4063 }
4164 }
4265
@@ -50,15 +73,29 @@ class BuiltJsonSerializers implements Serializers {
5073 if (serializer == null ) {
5174 throw new StateError ("No serializer for '${wireName }'." );
5275 }
53- final json = serializer.structured
54- ? (object as List ).sublist (1 )
55- : (object as List )[1 ];
56- return serializer.deserialize (this , json);
76+
77+ if (serializer is StructuredSerializer ) {
78+ return serializer.deserialize (this , (object as List ).sublist (1 ));
79+ } else if (serializer is PrimitiveSerializer ) {
80+ return serializer.deserialize (this , (object as List )[1 ]);
81+ } else {
82+ throw new StateError (
83+ 'serializer must be StructuredSerializer or PrimitiveSerializer' );
84+ }
5785 } else {
5886 final serializer = _getSerializerByType (specifiedType.root);
59- if (serializer == null ) throw new StateError (
60- "No serializer for '${specifiedType .root }'." );
61- return serializer.deserialize (this , object, specifiedType: specifiedType);
87+ if (serializer == null ) {
88+ throw new StateError ("No serializer for '${specifiedType .root }'." );
89+ }
90+
91+ if (serializer is StructuredSerializer ) {
92+ return serializer.deserialize (this , object as Iterable , specifiedType: specifiedType);
93+ } else if (serializer is PrimitiveSerializer ) {
94+ return serializer.deserialize (this , object, specifiedType: specifiedType);
95+ } else {
96+ throw new StateError (
97+ 'serializer must be StructuredSerializer or PrimitiveSerializer' );
98+ }
6299 }
63100 }
64101
@@ -90,24 +127,29 @@ class BuiltJsonSerializers implements Serializers {
90127/// Default implementation of [SerializersBuilder] .
91128class BuiltJsonSerializersBuilder implements SerializersBuilder {
92129 MapBuilder <Type , Serializer > _typeToSerializer =
93- new MapBuilder <Type , Serializer >();
130+ new MapBuilder <Type , Serializer >();
94131 MapBuilder <String , Serializer > _wireNameToSerializer =
95- new MapBuilder <String , Serializer >();
132+ new MapBuilder <String , Serializer >();
96133 MapBuilder <String , Serializer > _typeNameToSerializer =
97- new MapBuilder <String , Serializer >();
134+ new MapBuilder <String , Serializer >();
98135
99136 MapBuilder <FullType , Function > _builderFactories =
100- new MapBuilder <FullType , Function >();
137+ new MapBuilder <FullType , Function >();
101138
102139 BuiltJsonSerializersBuilder ();
103140
104- BuiltJsonSerializersBuilder ._(
105- this ._typeToSerializer,
141+ BuiltJsonSerializersBuilder ._(this ._typeToSerializer,
106142 this ._wireNameToSerializer,
107143 this ._typeNameToSerializer,
108144 this ._builderFactories);
109145
110146 void add (Serializer serializer) {
147+ if (serializer is ! StructuredSerializer &&
148+ serializer is ! PrimitiveSerializer ) {
149+ throw new ArgumentError (
150+ 'serializer must be StructuredSerializer or PrimitiveSerializer' );
151+ }
152+
111153 _wireNameToSerializer[serializer.wireName] = serializer;
112154 for (final type in serializer.types) {
113155 _typeToSerializer[type] = serializer;
0 commit comments