From 64f6ac55e7b26e6b61246f01ec176ae9f2eca12b Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 17 Sep 2024 11:12:14 +0800 Subject: [PATCH] DeMemberInfo --- .../org/redkale/convert/DeMemberInfo.java | 62 +++++++++++++++++++ .../org/redkale/convert/ObjectDecoder.java | 50 ++++----------- src/main/java/org/redkale/convert/Reader.java | 10 +-- .../org/redkale/convert/bson/BsonReader.java | 6 +- .../convert/ext/PatternSimpledCoder.java | 2 +- .../convert/json/JsonByteBufferReader.java | 6 +- .../convert/json/JsonMultiImplDecoder.java | 10 +-- .../org/redkale/convert/json/JsonReader.java | 7 +-- .../redkale/convert/pb/ProtobufReader.java | 5 +- .../test/convert/InnerCoderEntity.java | 17 +---- .../org/redkale/test/convert/Json5Test.java | 2 +- 11 files changed, 97 insertions(+), 80 deletions(-) create mode 100644 src/main/java/org/redkale/convert/DeMemberInfo.java 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));