Skip to content

Commit 347a41e

Browse files
improved json serializer and native context fact
1 parent 0399c93 commit 347a41e

File tree

3 files changed

+121
-482
lines changed

3 files changed

+121
-482
lines changed

src/main/java/codes/laivy/serializable/exception/MalformedClassException.java

-9
This file was deleted.

src/main/java/codes/laivy/serializable/factory/context/NativeContextFactory.java

+12-9
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
import codes.laivy.serializable.Allocator;
44
import codes.laivy.serializable.Serializer;
5-
import codes.laivy.serializable.annotations.UseEmptyConstructor;
65
import codes.laivy.serializable.config.Config;
76
import codes.laivy.serializable.context.ArrayContext;
87
import codes.laivy.serializable.context.Context;
98
import codes.laivy.serializable.context.MapContext;
109
import codes.laivy.serializable.context.PrimitiveContext;
1110
import codes.laivy.serializable.exception.IncompatibleReferenceException;
11+
import codes.laivy.serializable.exception.NullConcreteClassException;
1212
import codes.laivy.serializable.factory.instance.InstanceFactory;
1313
import codes.laivy.serializable.utilities.Classes;
1414
import org.jetbrains.annotations.NotNull;
@@ -42,7 +42,7 @@ public final class NativeContextFactory implements ContextFactory {
4242
int length = Array.getLength(object);
4343

4444
for (int index = 0; index < length; index++) {
45-
context.write(serializer.serialize(Array.get(object, index), config));
45+
context.write(serializer.serialize(Array.get(object, index)));
4646
}
4747

4848
return context;
@@ -124,10 +124,6 @@ public final class NativeContextFactory implements ContextFactory {
124124
@NotNull InstanceFactory instanceFactory = config.getInstanceFactory();
125125
@Nullable Father father = config.getFather();
126126

127-
if (reference.isAnnotationPresent(UseEmptyConstructor.class)) {
128-
instanceFactory = InstanceFactory.constructor();
129-
}
130-
131127
// Serialize
132128
@NotNull Object instance = instanceFactory.generate(reference);
133129

@@ -140,7 +136,10 @@ public final class NativeContextFactory implements ContextFactory {
140136
@Nullable Field field = fields.getOrDefault(name, null);
141137

142138
if (field == null) {
143-
throw new InvalidClassException("there's no field with name '" + name + "'");
139+
throw new IncompatibleReferenceException("there's no field with name '" + name + "' at class '" + reference.getName() + "'");
140+
} else if (object.getContext(name).isNullContext()) {
141+
// Set outer field instance
142+
Allocator.setFieldValue(field, instance, null);
144143
} else {
145144
config = Config.create(serializer, Father.create(field, instance));
146145

@@ -156,16 +155,20 @@ public final class NativeContextFactory implements ContextFactory {
156155
} else {
157156
@NotNull Class<?>[] references = Classes.getReferences(field);
158157

158+
if (references.length == 0) {
159+
throw new NullConcreteClassException("there's no concrete references for field '" + field + "'");
160+
}
161+
159162
for (@NotNull Class<?> fieldReference : references) try {
160163
// Set normal field instance
161-
@Nullable Object value = object.getObject(fieldReference, name);
164+
@Nullable Object value = object.getObject(fieldReference, name, Config.create(serializer, Father.create(field, instance)));
162165
Allocator.setFieldValue(field, instance, value);
163166

164167
continue fields;
165168
} catch (@NotNull IncompatibleReferenceException ignore) {
166169
}
167170

168-
throw new IncompatibleReferenceException("cannot deserialize field '" + field + "' because there's no compatible and concrete references for it: " + Arrays.toString(references));
171+
throw new IncompatibleReferenceException("cannot deserialize field '" + field + "' because there's no compatible references for it: " + Arrays.toString(references));
169172
}
170173
}
171174
}

0 commit comments

Comments
 (0)