优化MapEncoder
This commit is contained in:
@@ -28,6 +28,12 @@ public final class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
|
|||||||
|
|
||||||
private final Encodeable<Writer, V> valencoder;
|
private final Encodeable<Writer, V> valencoder;
|
||||||
|
|
||||||
|
private final Encodeable stringencoder;
|
||||||
|
|
||||||
|
private final boolean keyany;
|
||||||
|
|
||||||
|
private final boolean valany;
|
||||||
|
|
||||||
private boolean inited = false;
|
private boolean inited = false;
|
||||||
|
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
@@ -43,6 +49,9 @@ public final class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
|
|||||||
this.keyencoder = factory.getAnyEncoder();
|
this.keyencoder = factory.getAnyEncoder();
|
||||||
this.valencoder = factory.getAnyEncoder();
|
this.valencoder = factory.getAnyEncoder();
|
||||||
}
|
}
|
||||||
|
this.keyany = this.keyencoder == factory.getAnyEncoder();
|
||||||
|
this.valany = this.valencoder == factory.getAnyEncoder();
|
||||||
|
this.stringencoder = factory.loadEncoder(String.class);
|
||||||
} finally {
|
} finally {
|
||||||
inited = true;
|
inited = true;
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
@@ -58,7 +67,6 @@ public final class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
|
|||||||
out.writeNull();
|
out.writeNull();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.keyencoder == null || this.valencoder == null) {
|
if (this.keyencoder == null || this.valencoder == null) {
|
||||||
if (!this.inited) {
|
if (!this.inited) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
@@ -74,9 +82,19 @@ public final class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
|
|||||||
boolean first = true;
|
boolean first = true;
|
||||||
for (Map.Entry<K, V> en : values.entrySet()) {
|
for (Map.Entry<K, V> en : values.entrySet()) {
|
||||||
if (!first) out.writeArrayMark();
|
if (!first) out.writeArrayMark();
|
||||||
this.keyencoder.convertTo(out, en.getKey());
|
K key = en.getKey();
|
||||||
|
V val = en.getValue();
|
||||||
|
if (keyany && key instanceof String) {
|
||||||
|
this.stringencoder.convertTo(out, key);
|
||||||
|
} else {
|
||||||
|
this.keyencoder.convertTo(out, key);
|
||||||
|
}
|
||||||
out.writeMapMark();
|
out.writeMapMark();
|
||||||
this.valencoder.convertTo(out, en.getValue());
|
if (valany && val instanceof String) {
|
||||||
|
this.stringencoder.convertTo(out, val);
|
||||||
|
} else {
|
||||||
|
this.valencoder.convertTo(out, val);
|
||||||
|
}
|
||||||
if (first) first = false;
|
if (first) first = false;
|
||||||
}
|
}
|
||||||
out.writeMapE();
|
out.writeMapE();
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import org.redkale.util.*;
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
|
public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
|
||||||
|
|
||||||
public static final Type TYPE_MAP_STRING_STRING = new TypeToken<java.util.LinkedHashMap<String, String>>() {
|
public static final Type TYPE_MAP_STRING_STRING = new TypeToken<java.util.HashMap<String, String>>() {
|
||||||
}.getType();
|
}.getType();
|
||||||
|
|
||||||
private static final ObjectPool<JsonReader> readerPool = JsonReader.createPool(Integer.getInteger("convert.json.pool.size", 16));
|
private static final ObjectPool<JsonReader> readerPool = JsonReader.createPool(Integer.getInteger("convert.json.pool.size", 16));
|
||||||
|
|||||||
Reference in New Issue
Block a user