From c692deebe95de50596b86029b5f2cfc1f73f612f Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Wed, 20 Dec 2017 14:20:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96MapEncoder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/MapEncoder.java | 24 ++++++++++++++++--- src/org/redkale/convert/json/JsonConvert.java | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/org/redkale/convert/MapEncoder.java b/src/org/redkale/convert/MapEncoder.java index d7be51a38..6c60f64a4 100644 --- a/src/org/redkale/convert/MapEncoder.java +++ b/src/org/redkale/convert/MapEncoder.java @@ -28,6 +28,12 @@ public final class MapEncoder implements Encodeable> { private final Encodeable valencoder; + private final Encodeable stringencoder; + + private final boolean keyany; + + private final boolean valany; + private boolean inited = false; private final Object lock = new Object(); @@ -43,6 +49,9 @@ public final class MapEncoder implements Encodeable> { this.keyencoder = 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 { inited = true; synchronized (lock) { @@ -58,7 +67,6 @@ public final class MapEncoder implements Encodeable> { out.writeNull(); return; } - if (this.keyencoder == null || this.valencoder == null) { if (!this.inited) { synchronized (lock) { @@ -74,9 +82,19 @@ public final class MapEncoder implements Encodeable> { boolean first = true; for (Map.Entry en : values.entrySet()) { 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(); - 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; } out.writeMapE(); diff --git a/src/org/redkale/convert/json/JsonConvert.java b/src/org/redkale/convert/json/JsonConvert.java index a0eb218b3..584a0478f 100644 --- a/src/org/redkale/convert/json/JsonConvert.java +++ b/src/org/redkale/convert/json/JsonConvert.java @@ -23,7 +23,7 @@ import org.redkale.util.*; @SuppressWarnings("unchecked") public final class JsonConvert extends TextConvert { - public static final Type TYPE_MAP_STRING_STRING = new TypeToken>() { + public static final Type TYPE_MAP_STRING_STRING = new TypeToken>() { }.getType(); private static final ObjectPool readerPool = JsonReader.createPool(Integer.getInteger("convert.json.pool.size", 16));