Skip to content

Commit b1e75ba

Browse files
committed
Use FieldMismatchCallback in MetaSharedSerializer
1 parent 1cbf54d commit b1e75ba

File tree

2 files changed

+153
-12
lines changed

2 files changed

+153
-12
lines changed

java/fury-core/src/main/java/org/apache/fury/serializer/MetaSharedSerializer.java

+24-12
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,30 @@ public T read(MemoryBuffer buffer) {
148148
ObjectSerializer.FinalTypeField fieldInfo = finalFields[i];
149149
boolean isFinal = this.isFinal[i];
150150
FieldAccessor fieldAccessor = fieldInfo.fieldAccessor;
151-
if (fieldAccessor != null) {
152-
short classId = fieldInfo.classId;
151+
short classId = fieldInfo.classId;
152+
153+
if (fieldAccessor == null) {
154+
FieldMismatchCallback.FieldAdjustment fieldAdjustment =
155+
fury.getFieldMismatchCallback()
156+
.onMismatch(
157+
type,
158+
fieldInfo.classInfo.getCls().getName(),
159+
fieldInfo.qualifiedFieldName.substring(
160+
fieldInfo.qualifiedFieldName.lastIndexOf('.') + 1));
161+
FieldAccessor fallbackAccessor = null;
162+
try {
163+
fallbackAccessor = FieldAccessor.createAccessor(fieldAdjustment.getTargetField());
164+
} catch (RuntimeException ignored) {
165+
fallbackAccessor = null;
166+
}
167+
168+
if (fallbackAccessor != null) {
169+
Object fieldValue =
170+
ObjectSerializer.readFieldValue(
171+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer, classId);
172+
fallbackAccessor.putObject(obj, fieldAdjustment.adjustValue(fieldValue));
173+
}
174+
} else {
153175
if (ObjectSerializer.readPrimitiveFieldValueFailed(
154176
fury, buffer, obj, fieldAccessor, classId)
155177
&& ObjectSerializer.readBasicObjectFieldValueFailed(
@@ -160,16 +182,6 @@ public T read(MemoryBuffer buffer) {
160182
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
161183
fieldAccessor.putObject(obj, fieldValue);
162184
}
163-
} else {
164-
if (skipPrimitiveFieldValueFailed(fury, fieldInfo.classId, buffer)) {
165-
if (fieldInfo.classInfo == null) {
166-
// TODO(chaokunyang) support registered serializer in peer with ref tracking disabled.
167-
fury.readRef(buffer, classInfoHolder);
168-
} else {
169-
ObjectSerializer.readFinalObjectFieldValue(
170-
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
171-
}
172-
}
173185
}
174186
}
175187
for (ObjectSerializer.GenericTypeField fieldInfo : otherFields) {

java/fury-core/src/main/java/org/apache/fury/serializer/ObjectSerializer.java

+129
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,135 @@ static boolean readBasicObjectFieldValueFailed(
784784
}
785785
}
786786

787+
static Object readFieldValue(
788+
Fury fury,
789+
RefResolver refResolver,
790+
ClassResolver classResolver,
791+
FinalTypeField fieldInfo,
792+
boolean isFinal,
793+
MemoryBuffer buffer,
794+
short classId) {
795+
switch (classId) {
796+
case ClassResolver.PRIMITIVE_BOOLEAN_CLASS_ID:
797+
return buffer.readBoolean();
798+
case ClassResolver.PRIMITIVE_BYTE_CLASS_ID:
799+
return buffer.readByte();
800+
case ClassResolver.PRIMITIVE_CHAR_CLASS_ID:
801+
return buffer.readChar();
802+
case ClassResolver.PRIMITIVE_SHORT_CLASS_ID:
803+
return buffer.readInt16();
804+
case ClassResolver.PRIMITIVE_INT_CLASS_ID:
805+
if (fury.compressInt()) {
806+
return buffer.readVarInt32();
807+
} else {
808+
return buffer.readInt32();
809+
}
810+
case ClassResolver.PRIMITIVE_FLOAT_CLASS_ID:
811+
return buffer.readFloat32();
812+
case ClassResolver.PRIMITIVE_LONG_CLASS_ID:
813+
return fury.readInt64(buffer);
814+
case ClassResolver.PRIMITIVE_DOUBLE_CLASS_ID:
815+
return buffer.readFloat64();
816+
case ClassResolver.STRING_CLASS_ID:
817+
return fury.readJavaStringRef(buffer);
818+
case ClassResolver.BOOLEAN_CLASS_ID:
819+
{
820+
if (buffer.readByte() == Fury.NULL_FLAG) {
821+
return null;
822+
} else if (fury.isBasicTypesRefIgnored()) {
823+
return readFinalObjectFieldValue(
824+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
825+
} else {
826+
return buffer.readBoolean();
827+
}
828+
}
829+
case ClassResolver.BYTE_CLASS_ID:
830+
{
831+
if (buffer.readByte() == Fury.NULL_FLAG) {
832+
return null;
833+
} else if (fury.isBasicTypesRefIgnored()) {
834+
return readFinalObjectFieldValue(
835+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
836+
} else {
837+
return buffer.readByte();
838+
}
839+
}
840+
case ClassResolver.CHAR_CLASS_ID:
841+
{
842+
if (buffer.readByte() == Fury.NULL_FLAG) {
843+
return null;
844+
} else if (fury.isBasicTypesRefIgnored()) {
845+
return readFinalObjectFieldValue(
846+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
847+
} else {
848+
return buffer.readChar();
849+
}
850+
}
851+
case ClassResolver.SHORT_CLASS_ID:
852+
{
853+
if (buffer.readByte() == Fury.NULL_FLAG) {
854+
return null;
855+
} else if (fury.isBasicTypesRefIgnored()) {
856+
return readFinalObjectFieldValue(
857+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
858+
} else {
859+
return buffer.readInt16();
860+
}
861+
}
862+
case ClassResolver.INTEGER_CLASS_ID:
863+
{
864+
if (buffer.readByte() == Fury.NULL_FLAG) {
865+
return null;
866+
} else if (fury.isBasicTypesRefIgnored()) {
867+
return readFinalObjectFieldValue(
868+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
869+
} else {
870+
if (fury.compressInt()) {
871+
return buffer.readVarInt32();
872+
} else {
873+
return buffer.readInt32();
874+
}
875+
}
876+
}
877+
case ClassResolver.FLOAT_CLASS_ID:
878+
{
879+
if (buffer.readByte() == Fury.NULL_FLAG) {
880+
return null;
881+
} else if (fury.isBasicTypesRefIgnored()) {
882+
return readFinalObjectFieldValue(
883+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
884+
} else {
885+
return buffer.readFloat32();
886+
}
887+
}
888+
case ClassResolver.LONG_CLASS_ID:
889+
{
890+
if (buffer.readByte() == Fury.NULL_FLAG) {
891+
return null;
892+
} else if (fury.isBasicTypesRefIgnored()) {
893+
return readFinalObjectFieldValue(
894+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
895+
} else {
896+
return fury.readInt64(buffer);
897+
}
898+
}
899+
case ClassResolver.DOUBLE_CLASS_ID:
900+
{
901+
if (buffer.readByte() == Fury.NULL_FLAG) {
902+
return null;
903+
} else if (fury.isBasicTypesRefIgnored()) {
904+
return readFinalObjectFieldValue(
905+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
906+
} else {
907+
return buffer.readFloat64();
908+
}
909+
}
910+
default:
911+
return readFinalObjectFieldValue(
912+
fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
913+
}
914+
}
915+
787916
public static int computeVersionHash(Collection<Descriptor> descriptors) {
788917
// TODO(chaokunyang) use murmurhash
789918
List<Integer> list = new ArrayList<>();

0 commit comments

Comments
 (0)