This commit is contained in:
redkale
2024-09-19 16:20:34 +08:00
parent f4c4bfda70
commit 5f2abc725b
4 changed files with 42 additions and 76 deletions

View File

@@ -560,6 +560,32 @@ public abstract class ConvertFactory<R extends Reader, W extends Writer> {
return readGetSetFieldName((Method) element); return readGetSetFieldName((Method) element);
} }
public void sortFieldIndex(final Class clazz, List<AccessibleObject> members) {
Collections.sort(members, (o1, o2) -> {
ConvertColumnEntry ref1 = findRef(clazz, o1);
ConvertColumnEntry ref2 = findRef(clazz, o2);
if ((ref1 != null && ref1.getIndex() > 0) || (ref2 != null && ref2.getIndex() > 0)) {
int idx1 = ref1 == null ? Integer.MAX_VALUE / 2 : ref1.getIndex();
int idx2 = ref2 == null ? Integer.MAX_VALUE / 2 : ref2.getIndex();
if (idx1 != idx2) {
return idx1 - idx2;
}
}
String n1 = ref1 == null || ref1.name().isEmpty() ? readGetSetFieldName(o1) : ref1.name();
String n2 = ref2 == null || ref2.name().isEmpty() ? readGetSetFieldName(o2) : ref2.name();
if (n1 == null && n2 == null) {
return 0;
}
if (n1 == null) {
return -1;
}
if (n2 == null) {
return 1;
}
return n1.compareTo(n2);
});
}
public boolean isSimpleMemberType(Class declaringClass, Type type, Class clazz) { public boolean isSimpleMemberType(Class declaringClass, Type type, Class clazz) {
if (type == String.class) { if (type == String.class) {
return true; return true;

View File

@@ -6,10 +6,14 @@
package org.redkale.convert.json; package org.redkale.convert.json;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.lang.reflect.Type;
import java.util.*; import java.util.*;
import org.redkale.asm.*; import org.redkale.asm.AnnotationVisitor;
import org.redkale.asm.ClassWriter;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
import org.redkale.asm.FieldVisitor;
import org.redkale.asm.Label;
import org.redkale.asm.MethodVisitor;
import org.redkale.asm.Opcodes;
import static org.redkale.asm.Opcodes.*; import static org.redkale.asm.Opcodes.*;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.convert.ext.*; import org.redkale.convert.ext.*;
@@ -194,29 +198,7 @@ public abstract class JsonDynEncoder<T> implements Encodeable<JsonWriter, T> {
if (members == null) { if (members == null) {
return null; return null;
} }
Collections.sort(members, (o1, o2) -> { factory.sortFieldIndex(clazz, members);
ConvertColumnEntry ref1 = factory.findRef(clazz, o1);
ConvertColumnEntry ref2 = factory.findRef(clazz, o2);
if ((ref1 != null && ref1.getIndex() > 0) || (ref2 != null && ref2.getIndex() > 0)) {
int idx1 = ref1 == null ? Integer.MAX_VALUE / 2 : ref1.getIndex();
int idx2 = ref2 == null ? Integer.MAX_VALUE / 2 : ref2.getIndex();
if (idx1 != idx2) {
return idx1 - idx2;
}
}
String n1 = ref1 == null || ref1.name().isEmpty() ? factory.readGetSetFieldName(o1) : ref1.name();
String n2 = ref2 == null || ref2.name().isEmpty() ? factory.readGetSetFieldName(o2) : ref2.name();
if (n1 == null && n2 == null) {
return 0;
}
if (n1 == null) {
return -1;
}
if (n2 == null) {
return 1;
}
return n1.compareTo(n2);
});
return generateDyncEncoder(factory, clazz, members); return generateDyncEncoder(factory, clazz, members);
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();

View File

@@ -10,31 +10,11 @@ import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import org.redkale.convert.ConvertColumnEntry; import org.redkale.convert.*;
import org.redkale.convert.Encodeable; import org.redkale.convert.ext.*;
import org.redkale.convert.ObjectEncoder;
import org.redkale.convert.ext.BoolArraySimpledCoder;
import org.redkale.convert.ext.BoolSimpledCoder;
import org.redkale.convert.ext.ByteArraySimpledCoder;
import org.redkale.convert.ext.ByteSimpledCoder;
import org.redkale.convert.ext.CharArraySimpledCoder;
import org.redkale.convert.ext.CharSimpledCoder;
import org.redkale.convert.ext.DoubleArraySimpledCoder;
import org.redkale.convert.ext.DoubleSimpledCoder;
import org.redkale.convert.ext.FloatArraySimpledCoder;
import org.redkale.convert.ext.FloatSimpledCoder;
import org.redkale.convert.ext.IntArraySimpledCoder;
import org.redkale.convert.ext.IntSimpledCoder;
import org.redkale.convert.ext.LongArraySimpledCoder;
import org.redkale.convert.ext.LongSimpledCoder;
import org.redkale.convert.ext.ShortArraySimpledCoder;
import org.redkale.convert.ext.ShortSimpledCoder;
import org.redkale.convert.ext.StringArraySimpledCoder;
import org.redkale.convert.ext.StringSimpledCoder;
import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleClassLoader;
/** /**
@@ -202,29 +182,7 @@ public abstract class ProtobufDynEncoder<T> implements Encodeable<ProtobufWriter
if (members == null) { if (members == null) {
return null; return null;
} }
Collections.sort(members, (o1, o2) -> { factory.sortFieldIndex(clazz, members);
ConvertColumnEntry ref1 = factory.findRef(clazz, o1);
ConvertColumnEntry ref2 = factory.findRef(clazz, o2);
if ((ref1 != null && ref1.getIndex() > 0) || (ref2 != null && ref2.getIndex() > 0)) {
int idx1 = ref1 == null ? Integer.MAX_VALUE / 2 : ref1.getIndex();
int idx2 = ref2 == null ? Integer.MAX_VALUE / 2 : ref2.getIndex();
if (idx1 != idx2) {
return idx1 - idx2;
}
}
String n1 = ref1 == null || ref1.name().isEmpty() ? factory.readGetSetFieldName(o1) : ref1.name();
String n2 = ref2 == null || ref2.name().isEmpty() ? factory.readGetSetFieldName(o2) : ref2.name();
if (n1 == null && n2 == null) {
return 0;
}
if (n1 == null) {
return -1;
}
if (n2 == null) {
return 1;
}
return n1.compareTo(n2);
});
return generateDyncEncoder(factory, clazz, members); return generateDyncEncoder(factory, clazz, members);
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();

View File

@@ -13,22 +13,22 @@ import org.redkale.convert.json.JsonConvert;
* @author zhangjx * @author zhangjx
*/ */
public class User { public class User {
@ConvertColumn(index = 1) @ConvertColumn(index = 3)
private Long id; private Long id;
@ConvertColumn(index = 2) @ConvertColumn(index = 4)
private String name; private String name;
@ConvertColumn(index = 3) @ConvertColumn(index = 5)
private String nickName; private String nickName;
@ConvertColumn(index = 4) @ConvertColumn(index = 1)
private Integer age; private Integer age;
@ConvertColumn(index = 5) @ConvertColumn(index = 6)
private String sex; private String sex;
@ConvertColumn(index = 6) @ConvertColumn(index = 2)
private Date createTime; private Date createTime;
public static User create() { public static User create() {