1
1
// Copyright (c) 2015, Google Inc. Please see the AUTHORS file for details.
2
+
2
3
// All rights reserved. Use of this source code is governed by a BSD-style
3
4
// license that can be found in the LICENSE file.
4
5
@@ -8,8 +9,17 @@ import 'package:built_json/built_json.dart';
8
9
/// Default implementation of [Serializers] .
9
10
class BuiltJsonSerializers implements Serializers {
10
11
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.
11
20
final BuiltMap <String , Serializer > _wireNameToSerializer;
12
21
final BuiltMap <String , Serializer > _typeNameToSerializer;
22
+
13
23
final BuiltMap <FullType , Function > _builderFactories;
14
24
15
25
BuiltJsonSerializers ._(this ._typeToSerializer, this ._wireNameToSerializer,
@@ -20,23 +30,36 @@ class BuiltJsonSerializers implements Serializers {
20
30
{FullType specifiedType: FullType .unspecified}) {
21
31
if (specifiedType.isUnspecified) {
22
32
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 ) {
28
37
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
+ ];
30
44
} else {
31
- return < Object > [serializer.wireName, serialized];
45
+ throw new StateError (
46
+ 'serializer must be StructuredSerializer or PrimitiveSerializer' );
32
47
}
33
48
} else {
34
49
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
+ }
40
63
}
41
64
}
42
65
@@ -50,15 +73,29 @@ class BuiltJsonSerializers implements Serializers {
50
73
if (serializer == null ) {
51
74
throw new StateError ("No serializer for '${wireName }'." );
52
75
}
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
+ }
57
85
} else {
58
86
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
+ }
62
99
}
63
100
}
64
101
@@ -90,24 +127,29 @@ class BuiltJsonSerializers implements Serializers {
90
127
/// Default implementation of [SerializersBuilder] .
91
128
class BuiltJsonSerializersBuilder implements SerializersBuilder {
92
129
MapBuilder <Type , Serializer > _typeToSerializer =
93
- new MapBuilder <Type , Serializer >();
130
+ new MapBuilder <Type , Serializer >();
94
131
MapBuilder <String , Serializer > _wireNameToSerializer =
95
- new MapBuilder <String , Serializer >();
132
+ new MapBuilder <String , Serializer >();
96
133
MapBuilder <String , Serializer > _typeNameToSerializer =
97
- new MapBuilder <String , Serializer >();
134
+ new MapBuilder <String , Serializer >();
98
135
99
136
MapBuilder <FullType , Function > _builderFactories =
100
- new MapBuilder <FullType , Function >();
137
+ new MapBuilder <FullType , Function >();
101
138
102
139
BuiltJsonSerializersBuilder ();
103
140
104
- BuiltJsonSerializersBuilder ._(
105
- this ._typeToSerializer,
141
+ BuiltJsonSerializersBuilder ._(this ._typeToSerializer,
106
142
this ._wireNameToSerializer,
107
143
this ._typeNameToSerializer,
108
144
this ._builderFactories);
109
145
110
146
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
+
111
153
_wireNameToSerializer[serializer.wireName] = serializer;
112
154
for (final type in serializer.types) {
113
155
_typeToSerializer[type] = serializer;
0 commit comments