DeMemberInfo
This commit is contained in:
62
src/main/java/org/redkale/convert/DeMemberInfo.java
Normal file
62
src/main/java/org/redkale/convert/DeMemberInfo.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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) + '}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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值
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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(); // 跳过不存在的字段的值, 一般不会发生
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user