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[] members;
protected DeMemberNode memberNode;
protected Map<String, DeMember> memberFieldMap;
protected Map<Integer, DeMember> memberTagMap;
protected DeMemberInfo memberInfo;
@Nullable
protected ConvertFactory factory;
@@ -64,14 +58,13 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
} 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<R extends Reader, T> implements Decodeable<R, T> {
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<R, T, ?>[] 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<R extends Reader, T> implements Decodeable<R, T> {
}
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<R extends Reader, T> implements Decodeable<R, T> {
}
}
DeMemberNode fieldNode = this.memberNode;
Map<String, DeMember> fieldMap = this.memberFieldMap;
Map<Integer, DeMember> 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<R extends Reader, T> implements Decodeable<R, T> {
} else { // 带参数的构造函数
final DeMember<R, T, ?>[] 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<R extends Reader, T> implements Decodeable<R, T> {
}
public DeMember[] getMembers() {
return members;
return memberInfo.getMembers();
}
public DeMember getMember(String fieldName) {
return memberFieldMap.get(fieldName);
}
public Map<String, DeMember> getMemberFieldMap() {
return memberFieldMap;
}
public Map<Integer, DeMember> getMemberTagMap() {
return memberTagMap;
public DeMemberInfo getMemberInfo() {
return memberInfo;
}
public DeMember<R, T, ?>[] getConstructorMembers() {
@@ -510,6 +486,6 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
@Override
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;
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<String, DeMember> memberFieldMap, Map<Integer, DeMember> memberTagMap);
public abstract DeMember readFieldName(final DeMemberInfo memberInfo);
/**
* 读取一个boolean值

View File

@@ -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<String, DeMember> memberFieldMap, Map<Integer, DeMember> memberTagMap) {
public final DeMember readFieldName(final DeMemberInfo memberInfo) {
final String exceptedField = readSmallString();
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);
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;
}
}

View File

@@ -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<String, DeMember> memberFieldMap, Map<Integer, DeMember> 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;

View File

@@ -114,7 +114,7 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
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<T> implements Decodeable<JsonReader, T> {
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<T> implements Decodeable<JsonReader, T> {
} 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();
}
}

View File

@@ -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<String, DeMember> memberFieldMap, Map<Integer, DeMember> 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) {

View File

@@ -210,10 +210,9 @@ public class ProtobufReader extends Reader {
}
@Override
public final DeMember readFieldName(
final DeMemberNode fieldNode, Map<String, DeMember> memberFieldMap, Map<Integer, DeMember> 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;
}

View File

@@ -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<Reader, Writer, InnerCoderEntity>() {
private DeMemberNode memberNode;
private Map<String, DeMember> deMemberFieldMap;
private Map<Integer, DeMember> 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(); // 跳过不存在的字段的值, 一般不会发生

View File

@@ -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));