1- // Copyright 2021 The Terasology Foundation
1+ // Copyright 2022 The Terasology Foundation
22// SPDX-License-Identifier: Apache-2.0
33package org .terasology .persistence .typeHandling ;
44
1414 * A serializer provides low-level serialization support for a type, using a mapping of type handlers for each field of that type.
1515 *
1616 */
17- public class Serializer {
17+ public class Serializer < C > {
1818
1919 private static final Logger logger = LoggerFactory .getLogger (Serializer .class );
2020
21- private ClassMetadata <? , ?> classMetadata ;
22- private Map <FieldMetadata <? , ?>, TypeHandler > fieldHandlers ;
21+ private final ClassMetadata <C , ?> classMetadata ;
22+ private final Map <FieldMetadata <C , ?>, TypeHandler <?> > fieldHandlers ;
2323
24- public Serializer (ClassMetadata <? , ?> classMetadata , Map <FieldMetadata <? , ?>, TypeHandler > fieldHandlers ) {
24+ public Serializer (ClassMetadata <C , ? extends FieldMetadata < C , ?>> classMetadata , Map <FieldMetadata <C , ?>, TypeHandler <?> > fieldHandlers ) {
2525 this .fieldHandlers = fieldHandlers ;
2626 this .classMetadata = classMetadata ;
2727 }
@@ -30,8 +30,8 @@ public Serializer(ClassMetadata<?, ?> classMetadata, Map<FieldMetadata<?, ?>, Ty
3030 * @param field The metadata for a field of the type handled by this serializer.
3131 * @return The TypeHandler for the given field
3232 */
33- public TypeHandler <? > getHandlerFor (FieldMetadata <?, ? > field ) {
34- return fieldHandlers .get (field );
33+ public < F > TypeHandler <F > getHandlerFor (FieldMetadata <C , F > field ) {
34+ return ( TypeHandler < F >) fieldHandlers .get (field );
3535 }
3636
3737 /**
@@ -42,11 +42,10 @@ public TypeHandler<?> getHandlerFor(FieldMetadata<?, ?> field) {
4242 * @param context The current serialization context
4343 * @return The serialized value of the field
4444 */
45- @ SuppressWarnings ("unchecked" )
46- public PersistedData serialize (FieldMetadata <?, ?> field , Object container , PersistedDataSerializer context ) {
47- Object rawValue = field .getValue (container );
45+ public <F > PersistedData serialize (FieldMetadata <C , F > field , C container , PersistedDataSerializer context ) {
46+ F rawValue = field .getValue (container );
4847 if (rawValue != null ) {
49- TypeHandler handler = getHandlerFor (field );
48+ TypeHandler < F > handler = getHandlerFor (field );
5049 if (handler != null ) {
5150 return handler .serialize (rawValue , context );
5251 }
@@ -62,9 +61,9 @@ public PersistedData serialize(FieldMetadata<?, ?> field, Object container, Pers
6261 * @param rawValue The value to serialize
6362 * @return The serialized value
6463 */
65- @ SuppressWarnings ( "unchecked" )
66- public PersistedData serializeValue ( FieldMetadata <?, ?> fieldMetadata , Object rawValue , PersistedDataSerializer context ) {
67- return fieldHandlers . get ( fieldMetadata ) .serialize (rawValue , context );
64+ public < F > PersistedData serializeValue ( FieldMetadata < C , F > fieldMetadata , F rawValue , PersistedDataSerializer context ) {
65+ @ SuppressWarnings ( "unchecked" ) TypeHandler < F > handler = ( TypeHandler < F >) fieldHandlers . get ( fieldMetadata );
66+ return handler .serialize (rawValue , context );
6867 }
6968
7069 /**
@@ -74,13 +73,13 @@ public PersistedData serializeValue(FieldMetadata<?, ?> fieldMetadata, Object ra
7473 * @param fieldMetadata The metadata of the field
7574 * @param data The serialized value of the field
7675 */
77- public void deserializeOnto (Object target , FieldMetadata <?, ? > fieldMetadata , PersistedData data ) {
78- TypeHandler <? > handler = getHandlerFor (fieldMetadata );
76+ public < F > void deserializeOnto (C target , FieldMetadata <C , F > fieldMetadata , PersistedData data ) {
77+ TypeHandler <F > handler = getHandlerFor (fieldMetadata );
7978 if (handler == null ) {
8079 logger .error ("No type handler for type {} used by {}::{}" , fieldMetadata .getType (), target .getClass (), fieldMetadata );
8180 } else {
8281 try {
83- Object deserializedValue = handler .deserializeOrNull (data );
82+ F deserializedValue = handler .deserializeOrNull (data );
8483 fieldMetadata .setValue (target , deserializedValue );
8584 } catch (DeserializationException e ) {
8685 logger .error ("Unable to deserialize field '{}' from '{}'" , fieldMetadata .getName (), data .toString (), e );
@@ -94,7 +93,7 @@ public void deserializeOnto(Object target, FieldMetadata<?, ?> fieldMetadata, Pe
9493 * @param target The object to deserialize onto
9594 * @param values The collection of values to apply to the object
9695 */
97- public void deserializeOnto (Object target , PersistedDataMap values ) {
96+ public void deserializeOnto (C target , PersistedDataMap values ) {
9897 deserializeOnto (target , values , DeserializeFieldCheck .NullCheck .newInstance ());
9998 }
10099
@@ -105,15 +104,16 @@ public void deserializeOnto(Object target, PersistedDataMap values) {
105104 * @param values The collection of values to apply to the object
106105 * @param check A check to filter which fields to deserialize
107106 */
108- public void deserializeOnto (Object target , PersistedDataMap values , DeserializeFieldCheck check ) {
109- for (Map .Entry <String , PersistedData > field : values .entrySet ()) {
110- FieldMetadata <?, ?> fieldInfo = classMetadata .getField (field .getKey ());
111-
112- if (fieldInfo != null && check .shouldDeserialize (classMetadata , fieldInfo )) {
113- deserializeOnto (target , fieldInfo , field .getValue ());
114- } else if (fieldInfo == null ) {
115- logger .warn ("Cannot deserialize unknown field '{}' onto '{}'" , field .getKey (), classMetadata .getId ());
116- }
107+ public void deserializeOnto (C target , PersistedDataMap values , DeserializeFieldCheck check ) {
108+ values .entrySet ().forEach (field -> goomp (target , check , field .getKey (), field .getValue ()));
109+ }
110+
111+ private void goomp (C target , DeserializeFieldCheck check , String fieldName , PersistedData data ) {
112+ var fieldInfo = classMetadata .getField (fieldName );
113+ if (fieldInfo != null && check .shouldDeserialize (classMetadata , fieldInfo )) {
114+ deserializeOnto (target , fieldInfo , data );
115+ } else if (fieldInfo == null ) {
116+ logger .warn ("Cannot deserialize unknown field '{}' onto '{}'" , fieldName , classMetadata .getId ());
117117 }
118118 }
119119
@@ -123,7 +123,7 @@ public void deserializeOnto(Object target, PersistedDataMap values, DeserializeF
123123 * @param target The object to deserialize onto
124124 * @param values The collection of values to apply to the object
125125 */
126- public void deserializeOnto (Object target , Map <FieldMetadata <? , ?>, PersistedData > values ) {
126+ public void deserializeOnto (C target , Map <FieldMetadata <C , ?>, PersistedData > values ) {
127127 deserializeOnto (target , values , DeserializeFieldCheck .NullCheck .newInstance ());
128128 }
129129
@@ -134,12 +134,12 @@ public void deserializeOnto(Object target, Map<FieldMetadata<?, ?>, PersistedDat
134134 * @param values The collection of values to apply to the object
135135 * @param check A check to filter which fields to deserialize
136136 */
137- public void deserializeOnto (Object target , Map <FieldMetadata <? , ?>, PersistedData > values , DeserializeFieldCheck check ) {
138- for ( Map . Entry < FieldMetadata <?, ?>, PersistedData > field : values . entrySet ()) {
139- if (check .shouldDeserialize (classMetadata , field . getKey () )) {
140- deserializeOnto (target , field . getKey (), field . getValue () );
137+ public void deserializeOnto (C target , Map <FieldMetadata <C , ?>, PersistedData > values , DeserializeFieldCheck check ) {
138+ values . forEach (( field , data ) -> {
139+ if (check .shouldDeserialize (classMetadata , field )) {
140+ deserializeOnto (target , field , data );
141141 }
142- }
142+ });
143143 }
144144
145145
0 commit comments