DeMemberInfo

This commit is contained in:
redkale
2024-09-17 11:12:14 +08:00
parent a7cddab9fb
commit 64f6ac55e7
11 changed files with 97 additions and 80 deletions

View File

@@ -0,0 +1,62 @@
/*
* Copyright (c) 2016-2116 Redkale
* All rights reserved.
*/
package org.redkale.convert;
import java.util.HashMap;
import java.util.Map;
/**
* 字段的反序列化集合操作类
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public class DeMemberInfo {
protected final DeMember[] members;
protected final DeMemberNode memberNode;
protected final Map<String, DeMember> memberFieldMap;
protected final Map<Integer, DeMember> memberTagMap;
protected DeMemberInfo(DeMember... deMembers) {
this.members = deMembers;
this.memberFieldMap = new HashMap<>(deMembers.length);
this.memberTagMap = new HashMap<>(deMembers.length);
for (DeMember member : deMembers) {
this.memberFieldMap.put(member.getAttribute().field(), member);
this.memberTagMap.put(member.getTag(), member);
}
this.memberNode = DeMemberNode.create(deMembers);
}
public static DeMemberInfo create(DeMember... deMembers) {
return new DeMemberInfo(deMembers);
}
public int length() {
return members.length;
}
public DeMember[] getMembers() {
return members;
}
public DeMemberNode getMemberNode() {
return memberNode;
}
public DeMember getMemberByTag(int tag) {
return memberTagMap.get(tag);
}
public DeMember getMemberByField(String field) {
return memberFieldMap.get(field);
}
}

View File

@@ -32,13 +32,7 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
protected DeMember<R, T, ?>[] creatorConstructorMembers = null; protected DeMember<R, T, ?>[] creatorConstructorMembers = null;
protected DeMember[] members; protected DeMemberInfo memberInfo;
protected DeMemberNode memberNode;
protected Map<String, DeMember> memberFieldMap;
protected Map<Integer, DeMember> memberTagMap;
@Nullable @Nullable
protected ConvertFactory factory; protected ConvertFactory factory;
@@ -64,14 +58,13 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
} else { } else {
this.typeClass = (Class) type; this.typeClass = (Class) type;
} }
this.members = new DeMember[0]; this.memberInfo = DeMemberInfo.create();
} }
public void init(final ConvertFactory factory) { public void init(final ConvertFactory factory) {
this.factory = factory; this.factory = factory;
try { try {
if (type == Object.class) { if (type == Object.class) {
this.memberNode = DeMemberNode.create();
this.creatorConstructorMembers = null; this.creatorConstructorMembers = null;
return; return;
} }
@@ -308,14 +301,14 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
initForEachDeMember(factory, member); initForEachDeMember(factory, member);
} }
DeMember[] deMembers = list.toArray(new DeMember[list.size()]); DeMember[] deMembers = list.toArray(new DeMember[list.size()]);
Arrays.sort(this.members, (a, b) -> a.compareTo(factory.isFieldSort(), b)); Arrays.sort(deMembers, (a, b) -> a.compareTo(factory.isFieldSort(), b));
this.initFieldMember(deMembers); this.initFieldMember(deMembers);
if (cps != null) { if (cps != null) {
final String[] fields = cps; final String[] fields = cps;
final DeMember<R, T, ?>[] ms = new DeMember[fields.length]; final DeMember<R, T, ?>[] ms = new DeMember[fields.length];
for (int i = 0; i < fields.length; i++) { for (int i = 0; i < fields.length; i++) {
for (DeMember m : this.members) { for (DeMember m : memberInfo.members) {
if (m.attribute.field().equals(fields[i])) { if (m.attribute.field().equals(fields[i])) {
ms[i] = m; ms[i] = m;
break; break;
@@ -341,14 +334,7 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
} }
protected void initFieldMember(DeMember[] deMembers) { protected void initFieldMember(DeMember[] deMembers) {
this.members = deMembers; this.memberInfo = DeMemberInfo.create(deMembers);
this.memberFieldMap = new HashMap<>(this.members.length);
this.memberTagMap = new HashMap<>(this.members.length);
for (DeMember member : this.members) {
this.memberFieldMap.put(member.getAttribute().field(), member);
this.memberTagMap.put(member.getTag(), member);
}
this.memberNode = DeMemberNode.create(this.members);
} }
/** /**
@@ -384,14 +370,12 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
} }
} }
DeMemberNode fieldNode = this.memberNode; DeMemberInfo info = this.memberInfo;
Map<String, DeMember> fieldMap = this.memberFieldMap;
Map<Integer, DeMember> tagMap = this.memberTagMap;
if (this.creatorConstructorMembers == null) { // 空构造函数 if (this.creatorConstructorMembers == null) { // 空构造函数
final T result = this.creator == null ? null : this.creator.create(); final T result = this.creator == null ? null : this.creator.create();
boolean first = true; boolean first = true;
while (objin.hasNext()) { while (objin.hasNext()) {
DeMember member = objin.readFieldName(fieldNode, fieldMap, tagMap); DeMember member = objin.readFieldName(info);
objin.readBlank(); objin.readBlank();
if (member == null) { if (member == null) {
objin.skipValue(); // 跳过不存在的属性的值 objin.skipValue(); // 跳过不存在的属性的值
@@ -405,11 +389,11 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
} else { // 带参数的构造函数 } else { // 带参数的构造函数
final DeMember<R, T, ?>[] constructorFields = this.creatorConstructorMembers; final DeMember<R, T, ?>[] constructorFields = this.creatorConstructorMembers;
final Object[] constructorParams = new Object[constructorFields.length]; final Object[] constructorParams = new Object[constructorFields.length];
final Object[][] otherParams = new Object[this.members.length][2]; final Object[][] otherParams = new Object[info.length()][2];
int oc = 0; int oc = 0;
boolean first = true; boolean first = true;
while (objin.hasNext()) { while (objin.hasNext()) {
DeMember member = objin.readFieldName(fieldNode, fieldMap, tagMap); DeMember member = objin.readFieldName(info);
objin.readBlank(); objin.readBlank();
if (member == null) { if (member == null) {
objin.skipValue(); // 跳过不存在的属性的值 objin.skipValue(); // 跳过不存在的属性的值
@@ -485,19 +469,11 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
} }
public DeMember[] getMembers() { public DeMember[] getMembers() {
return members; return memberInfo.getMembers();
} }
public DeMember getMember(String fieldName) { public DeMemberInfo getMemberInfo() {
return memberFieldMap.get(fieldName); return memberInfo;
}
public Map<String, DeMember> getMemberFieldMap() {
return memberFieldMap;
}
public Map<Integer, DeMember> getMemberTagMap() {
return memberTagMap;
} }
public DeMember<R, T, ?>[] getConstructorMembers() { public DeMember<R, T, ?>[] getConstructorMembers() {
@@ -510,6 +486,6 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
@Override @Override
public String toString() { public String toString() {
return "ObjectDecoder{" + "type=" + type + ", members=" + Arrays.toString(members) + '}'; return "ObjectDecoder{" + "type=" + type + ", members=" + Arrays.toString(memberInfo.members) + '}';
} }
} }

View File

@@ -5,8 +5,6 @@
*/ */
package org.redkale.convert; package org.redkale.convert;
import java.util.Map;
/** /**
* 反序列化的数据读取流 * 反序列化的数据读取流
* *
@@ -136,13 +134,11 @@ public abstract class Reader {
/** /**
* 根据字段读取字段对应的DeMember * 根据字段读取字段对应的DeMember
* *
* @param fieldNode DeMember的全量集合 * @param memberInfo DeMember信息
* @param memberFieldMap DeMember的字段名map *
* @param memberTagMap DeMember的tag map
* @return 匹配的DeMember * @return 匹配的DeMember
*/ */
public abstract DeMember readFieldName( public abstract DeMember readFieldName(final DeMemberInfo memberInfo);
final DeMemberNode fieldNode, Map<String, DeMember> memberFieldMap, Map<Integer, DeMember> memberTagMap);
/** /**
* 读取一个boolean值 * 读取一个boolean值

View File

@@ -6,7 +6,6 @@
package org.redkale.convert.bson; package org.redkale.convert.bson;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Map;
import org.redkale.convert.*; import org.redkale.convert.*;
import static org.redkale.convert.Reader.SIGN_NULL; import static org.redkale.convert.Reader.SIGN_NULL;
import org.redkale.convert.ext.ByteSimpledCoder; import org.redkale.convert.ext.ByteSimpledCoder;
@@ -251,11 +250,10 @@ public class BsonReader extends Reader {
} }
@Override @Override
public final DeMember readFieldName( public final DeMember readFieldName(final DeMemberInfo memberInfo) {
final DeMemberNode fieldNode, Map<String, DeMember> memberFieldMap, Map<Integer, DeMember> memberTagMap) {
final String exceptedField = readSmallString(); final String exceptedField = readSmallString();
this.typeval = readByte(); this.typeval = readByte();
return fieldNode.getMember(exceptedField); return memberInfo.getMemberByField(exceptedField);
} }
// ------------------------------------------------------------ // ------------------------------------------------------------

View File

@@ -65,7 +65,7 @@ public class PatternSimpledCoder<R extends Reader, W extends Writer> extends Sim
StringSimpledCoder.instance); StringSimpledCoder.instance);
this.creator = args -> Pattern.compile((String) args[1], (Integer) args[0]); this.creator = args -> Pattern.compile((String) args[1], (Integer) args[0]);
this.initFieldMember(new DeMember[] {flagsMember, patternMember}); this.initFieldMember(new DeMember[] {flagsMember, patternMember});
this.creatorConstructorMembers = this.members; this.creatorConstructorMembers = this.getMembers();
this.inited = true; this.inited = true;
} }
} }

View File

@@ -7,7 +7,6 @@ package org.redkale.convert.json;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.UnmappableCharacterException; import java.nio.charset.UnmappableCharacterException;
import java.util.Map;
import org.redkale.convert.*; import org.redkale.convert.*;
import static org.redkale.convert.Reader.*; import static org.redkale.convert.Reader.*;
@@ -315,13 +314,12 @@ public class JsonByteBufferReader extends JsonReader {
} }
@Override @Override
public DeMember readFieldName( public DeMember readFieldName(final DeMemberInfo memberInfo) {
final DeMemberNode fieldNode, Map<String, DeMember> memberFieldMap, Map<Integer, DeMember> memberTagMap) {
char ch = nextGoodChar(true); char ch = nextGoodChar(true);
if (ch == 0) { if (ch == 0) {
return null; return null;
} }
DeMemberNode node = fieldNode; DeMemberNode node = memberInfo.getMemberNode();
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if (ch == '"' || ch == '\'') { if (ch == '"' || ch == '\'') {
final char quote = ch; final char quote = ch;

View File

@@ -114,7 +114,7 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
final Object[][] params = new Object[this.maxMemberCount][2]; final Object[][] params = new Object[this.maxMemberCount][2];
while (in.hasNext()) { while (in.hasNext()) {
String fieldName = in.readFieldName(); String fieldName = in.readFieldName();
DeMember member = decoder.getMember(fieldName); DeMember member = decoder.getMemberInfo().getMemberByField(fieldName);
// new Set[]{Utility.ofSet("1", "2", "3"), Utility.ofSet("2", "3"), Utility.ofSet("4", "2", "3"), // new Set[]{Utility.ofSet("1", "2", "3"), Utility.ofSet("2", "3"), Utility.ofSet("4", "2", "3"),
// Utility.ofSet("6", "7", "8"), Utility.ofSet("6", "9")}; // Utility.ofSet("6", "7", "8"), Utility.ofSet("6", "9")};
if (member == null && !finaled) { if (member == null && !finaled) {
@@ -123,10 +123,10 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
de = repeats.get(fieldName); de = repeats.get(fieldName);
if (de != null) { if (de != null) {
decoder = de; decoder = de;
member = de.getMember(fieldName); member = de.getMemberInfo().getMemberByField(fieldName);
for (int i = 0; i <= index; i++) { // 迁移params中的DeMember.Attribute for (int i = 0; i <= index; i++) { // 迁移params中的DeMember.Attribute
if (params[i] != null) { if (params[i] != null) {
DeMember dm = de.getMember(((Attribute) params[i][0]).field()); DeMember dm = de.getMemberInfo().getMemberByField(((Attribute) params[i][0]).field());
params[i][0] = dm == null ? null : dm.getAttribute(); params[i][0] = dm == null ? null : dm.getAttribute();
} }
} }
@@ -134,10 +134,10 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
} else { } else {
finaled = true; finaled = true;
decoder = de; decoder = de;
member = de.getMember(fieldName); member = de.getMemberInfo().getMemberByField(fieldName);
for (int i = 0; i <= index; i++) { // 迁移params中的DeMember.Attribute for (int i = 0; i <= index; i++) { // 迁移params中的DeMember.Attribute
if (params[i] != null) { if (params[i] != null) {
DeMember dm = de.getMember(((Attribute) params[i][0]).field()); DeMember dm = de.getMemberInfo().getMemberByField(((Attribute) params[i][0]).field());
params[i][0] = dm == null ? null : dm.getAttribute(); params[i][0] = dm == null ? null : dm.getAttribute();
} }
} }

View File

@@ -7,7 +7,6 @@ package org.redkale.convert.json;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map;
import org.redkale.convert.*; import org.redkale.convert.*;
import static org.redkale.convert.Reader.*; import static org.redkale.convert.Reader.*;
import org.redkale.convert.Reader.ValueType; import org.redkale.convert.Reader.ValueType;
@@ -659,14 +658,13 @@ public class JsonReader extends Reader {
} }
@Override @Override
public DeMember readFieldName( public DeMember readFieldName(final DeMemberInfo memberInfo) {
final DeMemberNode fieldNode, Map<String, DeMember> memberFieldMap, Map<Integer, DeMember> memberTagMap) {
final int eof = this.limit; final int eof = this.limit;
if (this.position == eof) { if (this.position == eof) {
return null; return null;
} }
DeMemberNode node = fieldNode; DeMemberNode node = memberInfo.getMemberNode();
char ch = nextGoodChar(true); // 需要跳过注释 char ch = nextGoodChar(true); // 需要跳过注释
final char[] text0 = this.text; final char[] text0 = this.text;
int currpos = this.position; int currpos = this.position;
@@ -682,6 +680,7 @@ public class JsonReader extends Reader {
this.position = currpos; this.position = currpos;
return node == null ? null : node.getValue(); return node == null ? null : node.getValue();
} else { } else {
node = node == null ? null : node.getNode(ch);
int start = currpos; int start = currpos;
for (; ; ) { for (; ; ) {
if (currpos == eof) { if (currpos == eof) {

View File

@@ -210,10 +210,9 @@ public class ProtobufReader extends Reader {
} }
@Override @Override
public final DeMember readFieldName( public final DeMember readFieldName(final DeMemberInfo memberInfo) {
final DeMemberNode fieldNode, Map<String, DeMember> memberFieldMap, Map<Integer, DeMember> memberTagMap) {
int tag = readTag(); int tag = readTag();
DeMember member = memberTagMap.get(tag); DeMember member = memberInfo.getMemberByTag(tag);
if (member != null) { if (member != null) {
return member; return member;
} }

View File

@@ -5,7 +5,6 @@
*/ */
package org.redkale.test.convert; package org.redkale.test.convert;
import java.util.*;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.convert.bson.*; import org.redkale.convert.bson.*;
import org.redkale.convert.json.*; import org.redkale.convert.json.*;
@@ -41,11 +40,7 @@ public class InnerCoderEntity {
final org.redkale.convert.ConvertFactory factory) { final org.redkale.convert.ConvertFactory factory) {
return new SimpledCoder<Reader, Writer, InnerCoderEntity>() { return new SimpledCoder<Reader, Writer, InnerCoderEntity>() {
private DeMemberNode memberNode; private DeMemberInfo memberInfo;
private Map<String, DeMember> deMemberFieldMap;
private Map<Integer, DeMember> deMemberTagMap;
// 必须与EnMember[] 顺序一致 // 必须与EnMember[] 顺序一致
private final DeMember[] deMembers = new DeMember[] { private final DeMember[] deMembers = new DeMember[] {
@@ -60,13 +55,7 @@ public class InnerCoderEntity {
}; };
{ {
this.deMemberFieldMap = new HashMap<>(this.deMembers.length); this.memberInfo = DeMemberInfo.create(deMembers);
this.deMemberTagMap = new HashMap<>(this.deMembers.length);
for (DeMember member : this.deMembers) {
this.deMemberFieldMap.put(member.getAttribute().field(), member);
this.deMemberTagMap.put(member.getTag(), member);
}
this.memberNode = DeMemberNode.create(deMembers);
} }
@Override @Override
@@ -88,7 +77,7 @@ public class InnerCoderEntity {
int index = 0; int index = 0;
final Object[] params = new Object[deMembers.length]; final Object[] params = new Object[deMembers.length];
while (in.hasNext()) { while (in.hasNext()) {
DeMember member = in.readFieldName(memberNode, deMemberFieldMap, deMemberTagMap); // 读取字段名 DeMember member = in.readFieldName(memberInfo); // 读取字段名
in.readBlank(); // 读取字段名与字段值之间的间隔符JSON则是跳过冒号: in.readBlank(); // 读取字段名与字段值之间的间隔符JSON则是跳过冒号:
if (member == null) { if (member == null) {
in.skipValue(); // 跳过不存在的字段的值, 一般不会发生 in.skipValue(); // 跳过不存在的字段的值, 一般不会发生

View File

@@ -40,7 +40,7 @@ public class Json5Test {
bean.name = "ha\t\"ha"; bean.name = "ha\t\"ha";
bean.desc = "normal"; bean.desc = "normal";
String json = String json =
"{/*多行\r\n注释**/\"decmails\":3.2,//单行注释\r\n\"id\":0x1F4,\"idx\":600,\"name\":\"ha\\t\\\"ha\",\"desc\":\"normal\",\"value\":44444,}"; "{/*多行\r\n注释**/\"decmails\":3.2,//单行注释\r\n\"id\":0x1F4,\"idx\":600,name:\"ha\\t\\\"ha\",\"desc\":\"normal\",\"value\":44444,}";
Json5Bean bean2 = convert.convertFrom(Json5Bean.class, json); Json5Bean bean2 = convert.convertFrom(Json5Bean.class, json);
System.out.println(bean2.name); System.out.println(bean2.name);
Assertions.assertTrue(bean.equals(bean2)); Assertions.assertTrue(bean.equals(bean2));