diff --git a/src/main/java/org/redkale/convert/DeMemberInfo.java b/src/main/java/org/redkale/convert/DeMemberInfo.java
new file mode 100644
index 000000000..f52c2eb09
--- /dev/null
+++ b/src/main/java/org/redkale/convert/DeMemberInfo.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2016-2116 Redkale
+ * All rights reserved.
+ */
+package org.redkale.convert;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 字段的反序列化集合操作类
+ *
+ *
详情见: https://redkale.org
+ *
+ * @author zhangjx
+ * @since 2.8.0
+ */
+public class DeMemberInfo {
+
+ protected final DeMember[] members;
+
+ protected final DeMemberNode memberNode;
+
+ protected final Map memberFieldMap;
+
+ protected final Map 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);
+ }
+}
diff --git a/src/main/java/org/redkale/convert/ObjectDecoder.java b/src/main/java/org/redkale/convert/ObjectDecoder.java
index dba3fd835..931198637 100644
--- a/src/main/java/org/redkale/convert/ObjectDecoder.java
+++ b/src/main/java/org/redkale/convert/ObjectDecoder.java
@@ -32,13 +32,7 @@ public class ObjectDecoder implements Decodeable {
protected DeMember[] creatorConstructorMembers = null;
- protected DeMember[] members;
-
- protected DeMemberNode memberNode;
-
- protected Map memberFieldMap;
-
- protected Map memberTagMap;
+ protected DeMemberInfo memberInfo;
@Nullable
protected ConvertFactory factory;
@@ -64,14 +58,13 @@ public class ObjectDecoder implements Decodeable {
} else {
this.typeClass = (Class) type;
}
- this.members = new DeMember[0];
+ this.memberInfo = DeMemberInfo.create();
}
public void init(final ConvertFactory factory) {
this.factory = factory;
try {
if (type == Object.class) {
- this.memberNode = DeMemberNode.create();
this.creatorConstructorMembers = null;
return;
}
@@ -308,14 +301,14 @@ public class ObjectDecoder implements Decodeable {
initForEachDeMember(factory, member);
}
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);
if (cps != null) {
final String[] fields = cps;
final DeMember[] ms = new DeMember[fields.length];
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])) {
ms[i] = m;
break;
@@ -341,14 +334,7 @@ public class ObjectDecoder implements Decodeable {
}
protected void initFieldMember(DeMember[] deMembers) {
- this.members = 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);
+ this.memberInfo = DeMemberInfo.create(deMembers);
}
/**
@@ -384,14 +370,12 @@ public class ObjectDecoder implements Decodeable {
}
}
- DeMemberNode fieldNode = this.memberNode;
- Map fieldMap = this.memberFieldMap;
- Map tagMap = this.memberTagMap;
+ DeMemberInfo info = this.memberInfo;
if (this.creatorConstructorMembers == null) { // 空构造函数
final T result = this.creator == null ? null : this.creator.create();
boolean first = true;
while (objin.hasNext()) {
- DeMember member = objin.readFieldName(fieldNode, fieldMap, tagMap);
+ DeMember member = objin.readFieldName(info);
objin.readBlank();
if (member == null) {
objin.skipValue(); // 跳过不存在的属性的值
@@ -405,11 +389,11 @@ public class ObjectDecoder implements Decodeable {
} else { // 带参数的构造函数
final DeMember[] constructorFields = this.creatorConstructorMembers;
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;
boolean first = true;
while (objin.hasNext()) {
- DeMember member = objin.readFieldName(fieldNode, fieldMap, tagMap);
+ DeMember member = objin.readFieldName(info);
objin.readBlank();
if (member == null) {
objin.skipValue(); // 跳过不存在的属性的值
@@ -485,19 +469,11 @@ public class ObjectDecoder implements Decodeable {
}
public DeMember[] getMembers() {
- return members;
+ return memberInfo.getMembers();
}
- public DeMember getMember(String fieldName) {
- return memberFieldMap.get(fieldName);
- }
-
- public Map getMemberFieldMap() {
- return memberFieldMap;
- }
-
- public Map getMemberTagMap() {
- return memberTagMap;
+ public DeMemberInfo getMemberInfo() {
+ return memberInfo;
}
public DeMember[] getConstructorMembers() {
@@ -510,6 +486,6 @@ public class ObjectDecoder implements Decodeable {
@Override
public String toString() {
- return "ObjectDecoder{" + "type=" + type + ", members=" + Arrays.toString(members) + '}';
+ return "ObjectDecoder{" + "type=" + type + ", members=" + Arrays.toString(memberInfo.members) + '}';
}
}
diff --git a/src/main/java/org/redkale/convert/Reader.java b/src/main/java/org/redkale/convert/Reader.java
index 988e47d88..4353306e7 100644
--- a/src/main/java/org/redkale/convert/Reader.java
+++ b/src/main/java/org/redkale/convert/Reader.java
@@ -5,8 +5,6 @@
*/
package org.redkale.convert;
-import java.util.Map;
-
/**
* 反序列化的数据读取流
*
@@ -136,13 +134,11 @@ public abstract class Reader {
/**
* 根据字段读取字段对应的DeMember
*
- * @param fieldNode DeMember的全量集合
- * @param memberFieldMap DeMember的字段名map
- * @param memberTagMap DeMember的tag map
+ * @param memberInfo DeMember信息
+ *
* @return 匹配的DeMember
*/
- public abstract DeMember readFieldName(
- final DeMemberNode fieldNode, Map memberFieldMap, Map memberTagMap);
+ public abstract DeMember readFieldName(final DeMemberInfo memberInfo);
/**
* 读取一个boolean值
diff --git a/src/main/java/org/redkale/convert/bson/BsonReader.java b/src/main/java/org/redkale/convert/bson/BsonReader.java
index aaf03a2bf..660c1fe46 100644
--- a/src/main/java/org/redkale/convert/bson/BsonReader.java
+++ b/src/main/java/org/redkale/convert/bson/BsonReader.java
@@ -6,7 +6,6 @@
package org.redkale.convert.bson;
import java.nio.charset.StandardCharsets;
-import java.util.Map;
import org.redkale.convert.*;
import static org.redkale.convert.Reader.SIGN_NULL;
import org.redkale.convert.ext.ByteSimpledCoder;
@@ -251,11 +250,10 @@ public class BsonReader extends Reader {
}
@Override
- public final DeMember readFieldName(
- final DeMemberNode fieldNode, Map memberFieldMap, Map memberTagMap) {
+ public final DeMember readFieldName(final DeMemberInfo memberInfo) {
final String exceptedField = readSmallString();
this.typeval = readByte();
- return fieldNode.getMember(exceptedField);
+ return memberInfo.getMemberByField(exceptedField);
}
// ------------------------------------------------------------
diff --git a/src/main/java/org/redkale/convert/ext/PatternSimpledCoder.java b/src/main/java/org/redkale/convert/ext/PatternSimpledCoder.java
index ed6cf0a04..4bceb202a 100644
--- a/src/main/java/org/redkale/convert/ext/PatternSimpledCoder.java
+++ b/src/main/java/org/redkale/convert/ext/PatternSimpledCoder.java
@@ -65,7 +65,7 @@ public class PatternSimpledCoder extends Sim
StringSimpledCoder.instance);
this.creator = args -> Pattern.compile((String) args[1], (Integer) args[0]);
this.initFieldMember(new DeMember[] {flagsMember, patternMember});
- this.creatorConstructorMembers = this.members;
+ this.creatorConstructorMembers = this.getMembers();
this.inited = true;
}
}
diff --git a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java
index 7037e8f14..c3c692e27 100644
--- a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java
+++ b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java
@@ -7,7 +7,6 @@ package org.redkale.convert.json;
import java.nio.ByteBuffer;
import java.nio.charset.UnmappableCharacterException;
-import java.util.Map;
import org.redkale.convert.*;
import static org.redkale.convert.Reader.*;
@@ -315,13 +314,12 @@ public class JsonByteBufferReader extends JsonReader {
}
@Override
- public DeMember readFieldName(
- final DeMemberNode fieldNode, Map memberFieldMap, Map memberTagMap) {
+ public DeMember readFieldName(final DeMemberInfo memberInfo) {
char ch = nextGoodChar(true);
if (ch == 0) {
return null;
}
- DeMemberNode node = fieldNode;
+ DeMemberNode node = memberInfo.getMemberNode();
StringBuilder sb = new StringBuilder();
if (ch == '"' || ch == '\'') {
final char quote = ch;
diff --git a/src/main/java/org/redkale/convert/json/JsonMultiImplDecoder.java b/src/main/java/org/redkale/convert/json/JsonMultiImplDecoder.java
index 63ef89fce..a9a30f475 100644
--- a/src/main/java/org/redkale/convert/json/JsonMultiImplDecoder.java
+++ b/src/main/java/org/redkale/convert/json/JsonMultiImplDecoder.java
@@ -114,7 +114,7 @@ public class JsonMultiImplDecoder implements Decodeable {
final Object[][] params = new Object[this.maxMemberCount][2];
while (in.hasNext()) {
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"),
// Utility.ofSet("6", "7", "8"), Utility.ofSet("6", "9")};
if (member == null && !finaled) {
@@ -123,10 +123,10 @@ public class JsonMultiImplDecoder implements Decodeable {
de = repeats.get(fieldName);
if (de != null) {
decoder = de;
- member = de.getMember(fieldName);
+ member = de.getMemberInfo().getMemberByField(fieldName);
for (int i = 0; i <= index; i++) { // 迁移params中的DeMember.Attribute
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();
}
}
@@ -134,10 +134,10 @@ public class JsonMultiImplDecoder implements Decodeable {
} else {
finaled = true;
decoder = de;
- member = de.getMember(fieldName);
+ member = de.getMemberInfo().getMemberByField(fieldName);
for (int i = 0; i <= index; i++) { // 迁移params中的DeMember.Attribute
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();
}
}
diff --git a/src/main/java/org/redkale/convert/json/JsonReader.java b/src/main/java/org/redkale/convert/json/JsonReader.java
index 6b9130666..3f9365c55 100644
--- a/src/main/java/org/redkale/convert/json/JsonReader.java
+++ b/src/main/java/org/redkale/convert/json/JsonReader.java
@@ -7,7 +7,6 @@ package org.redkale.convert.json;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
-import java.util.Map;
import org.redkale.convert.*;
import static org.redkale.convert.Reader.*;
import org.redkale.convert.Reader.ValueType;
@@ -659,14 +658,13 @@ public class JsonReader extends Reader {
}
@Override
- public DeMember readFieldName(
- final DeMemberNode fieldNode, Map memberFieldMap, Map memberTagMap) {
+ public DeMember readFieldName(final DeMemberInfo memberInfo) {
final int eof = this.limit;
if (this.position == eof) {
return null;
}
- DeMemberNode node = fieldNode;
+ DeMemberNode node = memberInfo.getMemberNode();
char ch = nextGoodChar(true); // 需要跳过注释
final char[] text0 = this.text;
int currpos = this.position;
@@ -682,6 +680,7 @@ public class JsonReader extends Reader {
this.position = currpos;
return node == null ? null : node.getValue();
} else {
+ node = node == null ? null : node.getNode(ch);
int start = currpos;
for (; ; ) {
if (currpos == eof) {
diff --git a/src/main/java/org/redkale/convert/pb/ProtobufReader.java b/src/main/java/org/redkale/convert/pb/ProtobufReader.java
index 332ee3e1f..f04eff393 100644
--- a/src/main/java/org/redkale/convert/pb/ProtobufReader.java
+++ b/src/main/java/org/redkale/convert/pb/ProtobufReader.java
@@ -210,10 +210,9 @@ public class ProtobufReader extends Reader {
}
@Override
- public final DeMember readFieldName(
- final DeMemberNode fieldNode, Map memberFieldMap, Map memberTagMap) {
+ public final DeMember readFieldName(final DeMemberInfo memberInfo) {
int tag = readTag();
- DeMember member = memberTagMap.get(tag);
+ DeMember member = memberInfo.getMemberByTag(tag);
if (member != null) {
return member;
}
diff --git a/src/test/java/org/redkale/test/convert/InnerCoderEntity.java b/src/test/java/org/redkale/test/convert/InnerCoderEntity.java
index e86248dc2..d27f55647 100644
--- a/src/test/java/org/redkale/test/convert/InnerCoderEntity.java
+++ b/src/test/java/org/redkale/test/convert/InnerCoderEntity.java
@@ -5,7 +5,6 @@
*/
package org.redkale.test.convert;
-import java.util.*;
import org.redkale.convert.*;
import org.redkale.convert.bson.*;
import org.redkale.convert.json.*;
@@ -41,11 +40,7 @@ public class InnerCoderEntity {
final org.redkale.convert.ConvertFactory factory) {
return new SimpledCoder() {
- private DeMemberNode memberNode;
-
- private Map deMemberFieldMap;
-
- private Map deMemberTagMap;
+ private DeMemberInfo memberInfo;
// 必须与EnMember[] 顺序一致
private final DeMember[] deMembers = new DeMember[] {
@@ -60,13 +55,7 @@ public class InnerCoderEntity {
};
{
- this.deMemberFieldMap = new HashMap<>(this.deMembers.length);
- 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);
+ this.memberInfo = DeMemberInfo.create(deMembers);
}
@Override
@@ -88,7 +77,7 @@ public class InnerCoderEntity {
int index = 0;
final Object[] params = new Object[deMembers.length];
while (in.hasNext()) {
- DeMember member = in.readFieldName(memberNode, deMemberFieldMap, deMemberTagMap); // 读取字段名
+ DeMember member = in.readFieldName(memberInfo); // 读取字段名
in.readBlank(); // 读取字段名与字段值之间的间隔符,JSON则是跳过冒号:
if (member == null) {
in.skipValue(); // 跳过不存在的字段的值, 一般不会发生
diff --git a/src/test/java/org/redkale/test/convert/Json5Test.java b/src/test/java/org/redkale/test/convert/Json5Test.java
index 3f45e10a9..cc7c2ad88 100644
--- a/src/test/java/org/redkale/test/convert/Json5Test.java
+++ b/src/test/java/org/redkale/test/convert/Json5Test.java
@@ -40,7 +40,7 @@ public class Json5Test {
bean.name = "ha\t\"ha";
bean.desc = "normal";
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);
System.out.println(bean2.name);
Assertions.assertTrue(bean.equals(bean2));