Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
hening committed Feb 5, 2025
1 parent d27d8b6 commit 62c1bb3
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ protected T newBean() {
descriptor.getField() != null
? FieldAccessor.createAccessor(descriptor.getField())
: null,
fury);
fury, descriptor.getField() != null ? descriptor.getField().getAnnotation(FieldInfo.class) : null);
otherFields[cnt++] = genericTypeField;
}
cnt = 0;
Expand All @@ -400,15 +400,15 @@ private static FinalTypeField buildFinalTypeField(Fury fury, Descriptor d) {
d.getDeclaringClass() + "." + d.getName(),
// `d.getField()` will be null when peer class doesn't have this field.
d.getField() != null ? FieldAccessor.createAccessor(d.getField()) : null,
fury);
fury, d.getField() != null ? d.getField().getAnnotation(FieldInfo.class) : null);
}

private static GenericTypeField buildContainerField(Fury fury, Descriptor d) {
return new GenericTypeField(
d.getTypeRef(),
d.getDeclaringClass() + "." + d.getName(),
d.getField() != null ? FieldAccessor.createAccessor(d.getField()) : null,
fury);
fury, d.getField() != null ? d.getField().getAnnotation(FieldInfo.class) : null);
}

public static class InternalFieldInfo {
Expand All @@ -418,10 +418,11 @@ public static class InternalFieldInfo {
protected FieldInfo fieldInfo;

private InternalFieldInfo(
short classId, String qualifiedFieldName, FieldAccessor fieldAccessor) {
short classId, String qualifiedFieldName, FieldAccessor fieldAccessor, FieldInfo fieldInfo) {
this.classId = classId;
this.qualifiedFieldName = qualifiedFieldName;
this.fieldAccessor = fieldAccessor;
this.fieldInfo = fieldInfo;
}

@Override
Expand All @@ -433,15 +434,17 @@ public String toString() {
+ qualifiedFieldName
+ ", field="
+ (fieldAccessor != null ? fieldAccessor.getField() : null)
+ ", fieldInfo="
+ fieldInfo
+ '}';
}
}

static final class FinalTypeField extends InternalFieldInfo {
final ClassInfo classInfo;

private FinalTypeField(Class<?> type, String fieldName, FieldAccessor accessor, Fury fury) {
super(getRegisteredClassId(fury, type), fieldName, accessor);
private FinalTypeField(Class<?> type, String fieldName, FieldAccessor accessor, Fury fury, FieldInfo fieldInfo) {
super(getRegisteredClassId(fury, type), fieldName, accessor, fieldInfo);
// invoke `copy` to avoid ObjectSerializer construct clear serializer by `clearSerializer`.
if (type == FinalObjectTypeStub.class) {
// `FinalObjectTypeStub` has no fields, using its `classInfo`
Expand All @@ -459,17 +462,17 @@ static final class GenericTypeField extends InternalFieldInfo {
final boolean trackingRef;

private GenericTypeField(
Class<?> cls, String qualifiedFieldName, FieldAccessor accessor, Fury fury) {
super(getRegisteredClassId(fury, cls), qualifiedFieldName, accessor);
Class<?> cls, String qualifiedFieldName, FieldAccessor accessor, Fury fury, FieldInfo fieldInfo) {
super(getRegisteredClassId(fury, cls), qualifiedFieldName, accessor, fieldInfo);
// TODO support generics <T> in Pojo<T>, see ComplexObjectSerializer.getGenericTypes
genericType = fury.getClassResolver().buildGenericType(cls);
classInfoHolder = fury.getClassResolver().nilClassInfoHolder();
trackingRef = fury.getClassResolver().needToWriteRef(cls);
}

private GenericTypeField(
TypeRef<?> typeRef, String qualifiedFieldName, FieldAccessor accessor, Fury fury) {
super(getRegisteredClassId(fury, getRawType(typeRef)), qualifiedFieldName, accessor);
TypeRef<?> typeRef, String qualifiedFieldName, FieldAccessor accessor, Fury fury, FieldInfo fieldInfo) {
super(getRegisteredClassId(fury, getRawType(typeRef)), qualifiedFieldName, accessor, fieldInfo);
// TODO support generics <T> in Pojo<T>, see ComplexObjectSerializer.getGenericTypes
genericType = fury.getClassResolver().buildGenericType(typeRef);
classInfoHolder = fury.getClassResolver().nilClassInfoHolder();
Expand All @@ -487,6 +490,8 @@ public String toString() {
+ qualifiedFieldName
+ ", field="
+ (fieldAccessor != null ? fieldAccessor.getField() : null)
+ ", fieldInfo="
+ fieldInfo
+ '}';
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -300,24 +300,27 @@ public Object[] readFields(MemoryBuffer buffer) {
boolean metaShareEnabled = fury.getConfig().isMetaShareEnabled();
for (int i = 0; i < finalFields.length; i++) {
FinalTypeField fieldInfo = finalFields[i];
boolean isFinal = !metaShareEnabled || this.isFinal[i];
FieldInfo fieldInfoAnnotation = fieldInfo.fieldInfo;
boolean isFinal = !metaShareEnabled || this.isFinal[i];
short classId = fieldInfo.classId;
if (classId >= ClassResolver.PRIMITIVE_BOOLEAN_CLASS_ID
&& classId <= ClassResolver.PRIMITIVE_DOUBLE_CLASS_ID) {
fieldValues[counter++] = Serializers.readPrimitiveValue(fury, buffer, classId);
} else {
Object fieldValue =
readFinalObjectFieldValue(fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
readFinalObjectFieldValue(fury, refResolver, classResolver, fieldInfo, isFinal, buffer, fieldInfoAnnotation);
fieldValues[counter++] = fieldValue;
}
}
for (GenericTypeField fieldInfo : otherFields) {
Object fieldValue = readOtherFieldValue(fury, fieldInfo, buffer);
FieldInfo fieldInfoAnnotation = fieldInfo.fieldInfo;
Object fieldValue = readOtherFieldValue(fury, fieldInfo, buffer, fieldInfoAnnotation);
fieldValues[counter++] = fieldValue;
}
Generics generics = fury.getGenerics();
for (GenericTypeField fieldInfo : containerFields) {
Object fieldValue = readContainerFieldValue(fury, generics, fieldInfo, buffer);
FieldInfo fieldInfoAnnotation = fieldInfo.fieldInfo;
Object fieldValue = readContainerFieldValue(fury, generics, fieldInfo, buffer, fieldInfoAnnotation);
fieldValues[counter++] = fieldValue;
}
return fieldValues;
Expand All @@ -338,22 +341,25 @@ public T readAndSetFields(MemoryBuffer buffer, T obj) {
FinalTypeField fieldInfo = finalFields[i];
boolean isFinal = !metaShareEnabled || this.isFinal[i];
FieldAccessor fieldAccessor = fieldInfo.fieldAccessor;
short classId = fieldInfo.classId;
FieldInfo fieldInfoAnnotation = fieldInfo.fieldInfo;
short classId = fieldInfo.classId;
if (readPrimitiveFieldValueFailed(fury, buffer, obj, fieldAccessor, classId)
&& readBasicObjectFieldValueFailed(fury, buffer, obj, fieldAccessor, classId)) {
&& readBasicObjectFieldValueFailed(fury, buffer, obj, fieldAccessor, classId, fieldInfoAnnotation)) {
Object fieldValue =
readFinalObjectFieldValue(fury, refResolver, classResolver, fieldInfo, isFinal, buffer);
readFinalObjectFieldValue(fury, refResolver, classResolver, fieldInfo, isFinal, buffer, fieldInfoAnnotation);
fieldAccessor.putObject(obj, fieldValue);
}
}
for (GenericTypeField fieldInfo : otherFields) {
Object fieldValue = readOtherFieldValue(fury, fieldInfo, buffer);
FieldInfo fieldInfoAnnotation = fieldInfo.fieldInfo;
Object fieldValue = readOtherFieldValue(fury, fieldInfo, buffer, fieldInfoAnnotation);
FieldAccessor fieldAccessor = fieldInfo.fieldAccessor;
fieldAccessor.putObject(obj, fieldValue);
}
Generics generics = fury.getGenerics();
for (GenericTypeField fieldInfo : containerFields) {
Object fieldValue = readContainerFieldValue(fury, generics, fieldInfo, buffer);
FieldInfo fieldInfoAnnotation = fieldInfo.fieldInfo;
Object fieldValue = readContainerFieldValue(fury, generics, fieldInfo, buffer, fieldInfoAnnotation);
FieldAccessor fieldAccessor = fieldInfo.fieldAccessor;
fieldAccessor.putObject(obj, fieldValue);
}
Expand All @@ -370,7 +376,7 @@ static Object readFinalObjectFieldValue(
ClassResolver classResolver,
FinalTypeField fieldInfo,
boolean isFinal,
MemoryBuffer buffer) {
MemoryBuffer buffer, FieldInfo fieldInfoAnnotation) {
Serializer<Object> serializer = fieldInfo.classInfo.getSerializer();
Object fieldValue;
if (isFinal) {
Expand All @@ -388,49 +394,63 @@ static Object readFinalObjectFieldValue(
fieldValue = refResolver.getReadObject();
}
} else {
byte headFlag = buffer.readByte();
if (headFlag == Fury.NULL_FLAG) {
fieldValue = null;
} else {
classResolver.readClassInfo(buffer, fieldInfo.classInfo);
fieldValue = serializer.read(buffer);
}
if (fieldInfoAnnotation != null && !fieldInfoAnnotation.nullable()) {
fieldValue = serializer.read(buffer);
} else {
byte headFlag = buffer.readByte();
if (headFlag == Fury.NULL_FLAG) {
fieldValue = null;
} else {
classResolver.readClassInfo(buffer, fieldInfo.classInfo);
fieldValue = serializer.read(buffer);
}
}
}
}
return fieldValue;
}

static Object readOtherFieldValue(Fury fury, GenericTypeField fieldInfo, MemoryBuffer buffer) {
static Object readOtherFieldValue(Fury fury, GenericTypeField fieldInfo, MemoryBuffer buffer, FieldInfo fieldInfoAnnotation) {
Object fieldValue;
if (fieldInfo.trackingRef) {
fieldValue = fury.readRef(buffer, fieldInfo.classInfoHolder);
} else {
byte headFlag = buffer.readByte();
if (headFlag == Fury.NULL_FLAG) {
fieldValue = null;
} else {
fieldValue = fury.readNonRef(buffer, fieldInfo.classInfoHolder);
}
if (fieldInfoAnnotation != null && !fieldInfoAnnotation.nullable()) {
fieldValue = fury.readNonRef(buffer, fieldInfo.classInfoHolder);
} else {
byte headFlag = buffer.readByte();
if (headFlag == Fury.NULL_FLAG) {
fieldValue = null;
} else {
fieldValue = fury.readNonRef(buffer, fieldInfo.classInfoHolder);
}
}
}
return fieldValue;
}

static Object readContainerFieldValue(
Fury fury, Generics generics, GenericTypeField fieldInfo, MemoryBuffer buffer) {
Fury fury, Generics generics, GenericTypeField fieldInfo, MemoryBuffer buffer, FieldInfo fieldInfoAnnotation) {
Object fieldValue;
if (fieldInfo.trackingRef) {
generics.pushGenericType(fieldInfo.genericType);
fieldValue = fury.readRef(buffer, fieldInfo.classInfoHolder);
generics.popGenericType();
} else {
byte headFlag = buffer.readByte();
if (headFlag == Fury.NULL_FLAG) {
fieldValue = null;
} else {
generics.pushGenericType(fieldInfo.genericType);
fieldValue = fury.readNonRef(buffer, fieldInfo.classInfoHolder);
generics.popGenericType();
}
if (fieldInfoAnnotation != null && !fieldInfoAnnotation.nullable()) {
generics.pushGenericType(fieldInfo.genericType);
fieldValue = fury.readNonRef(buffer, fieldInfo.classInfoHolder);
generics.popGenericType();
} else {
byte headFlag = buffer.readByte();
if (headFlag == Fury.NULL_FLAG) {
fieldValue = null;
} else {
generics.pushGenericType(fieldInfo.genericType);
fieldValue = fury.readNonRef(buffer, fieldInfo.classInfoHolder);
generics.popGenericType();
}
}
}
return fieldValue;
}
Expand Down Expand Up @@ -768,16 +788,26 @@ static boolean readBasicObjectFieldValueFailed(
MemoryBuffer buffer,
Object targetObject,
FieldAccessor fieldAccessor,
short classId) {
short classId, FieldInfo fieldInfoAnnotation) {
if (!fury.isBasicTypesRefIgnored()) {
return true; // let common path handle this.
}
boolean trackingRef = false;
boolean nullable = true;
if (fieldInfoAnnotation != null) {
trackingRef = fieldInfoAnnotation.trackingRef();
nullable = fieldInfoAnnotation.nullable();
}
// add time types serialization here.
switch (classId) {
case ClassResolver.STRING_CLASS_ID: // fastpath for string.
fieldAccessor.putObject(targetObject, fury.readJavaStringRef(buffer));
return false;
case ClassResolver.BOOLEAN_CLASS_ID:
if (!nullable) {
fieldAccessor.putObject(targetObject, buffer.readBoolean());
return false;
}
{
if (buffer.readByte() == Fury.NULL_FLAG) {
fieldAccessor.putObject(targetObject, null);
Expand All @@ -787,6 +817,10 @@ static boolean readBasicObjectFieldValueFailed(
return false;
}
case ClassResolver.BYTE_CLASS_ID:
if (!nullable) {
fieldAccessor.putObject(targetObject, buffer.readByte());
return false;
}
{
if (buffer.readByte() == Fury.NULL_FLAG) {
fieldAccessor.putObject(targetObject, null);
Expand All @@ -796,6 +830,10 @@ static boolean readBasicObjectFieldValueFailed(
return false;
}
case ClassResolver.CHAR_CLASS_ID:
if (!nullable) {
fieldAccessor.putObject(targetObject, buffer.readChar());
return false;
}
{
if (buffer.readByte() == Fury.NULL_FLAG) {
fieldAccessor.putObject(targetObject, null);
Expand All @@ -805,6 +843,10 @@ static boolean readBasicObjectFieldValueFailed(
return false;
}
case ClassResolver.SHORT_CLASS_ID:
if (!nullable) {
fieldAccessor.putObject(targetObject, buffer.readInt16());
return false;
}
{
if (buffer.readByte() == Fury.NULL_FLAG) {
fieldAccessor.putObject(targetObject, null);
Expand All @@ -814,6 +856,14 @@ static boolean readBasicObjectFieldValueFailed(
return false;
}
case ClassResolver.INTEGER_CLASS_ID:
if (!nullable) {
if (fury.compressInt()) {
fieldAccessor.putObject(targetObject, buffer.readVarInt32());
} else {
fieldAccessor.putObject(targetObject, buffer.readInt32());
}
return false;
}
{
if (buffer.readByte() == Fury.NULL_FLAG) {
fieldAccessor.putObject(targetObject, null);
Expand All @@ -827,6 +877,10 @@ static boolean readBasicObjectFieldValueFailed(
return false;
}
case ClassResolver.FLOAT_CLASS_ID:
if (!nullable) {
fieldAccessor.putObject(targetObject, buffer.readFloat32());
return false;
}
{
if (buffer.readByte() == Fury.NULL_FLAG) {
fieldAccessor.putObject(targetObject, null);
Expand All @@ -836,6 +890,10 @@ static boolean readBasicObjectFieldValueFailed(
return false;
}
case ClassResolver.LONG_CLASS_ID:
if (!nullable) {
fieldAccessor.putObject(targetObject, fury.readInt64(buffer));
return false;
}
{
if (buffer.readByte() == Fury.NULL_FLAG) {
fieldAccessor.putObject(targetObject, null);
Expand All @@ -845,6 +903,10 @@ static boolean readBasicObjectFieldValueFailed(
return false;
}
case ClassResolver.DOUBLE_CLASS_ID:
if (!nullable) {
fieldAccessor.putObject(targetObject, buffer.readFloat64());
return false;
}
{
if (buffer.readByte() == Fury.NULL_FLAG) {
fieldAccessor.putObject(targetObject, null);
Expand Down

0 comments on commit 62c1bb3

Please sign in to comment.