diff --git a/namesrv/src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java b/namesrv/src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java index 6df8c65bf3f..48a0342960d 100644 --- a/namesrv/src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java +++ b/namesrv/src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java @@ -16,6 +16,7 @@ */ package org.apache.rocketmq.namesrv.processor; +import com.alibaba.fastjson.serializer.SerializerFeature; import io.netty.channel.ChannelHandlerContext; import java.io.UnsupportedEncodingException; import java.util.Properties; @@ -362,7 +363,9 @@ public RemotingCommand getRouteInfoByTopic(ChannelHandlerContext ctx, topicRouteData.setOrderTopicConf(orderTopicConf); } - byte[] content = topicRouteData.encode(); + byte[] content = topicRouteData.encode(SerializerFeature.BrowserCompatible, + SerializerFeature.QuoteFieldNames, SerializerFeature.SkipTransientField, + SerializerFeature.MapSortField); response.setBody(content); response.setCode(ResponseCode.SUCCESS); response.setRemark(null); diff --git a/remoting/pom.xml b/remoting/pom.xml index 32320e6d050..1474e04ddae 100644 --- a/remoting/pom.xml +++ b/remoting/pom.xml @@ -40,5 +40,12 @@ ${project.groupId} rocketmq-logging + + + com.google.code.gson + gson + 2.9.0 + test + diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/protocol/RemotingSerializable.java b/remoting/src/main/java/org/apache/rocketmq/remoting/protocol/RemotingSerializable.java index 4a32f65ff66..182b5e7d08a 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/protocol/RemotingSerializable.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/protocol/RemotingSerializable.java @@ -17,6 +17,8 @@ package org.apache.rocketmq.remoting.protocol; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; + import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -52,6 +54,17 @@ public byte[] encode() { return null; } + /** + * Allow call-site to apply specific features according to their requirements. + * + * @param features Features to apply + * @return serialized data. + */ + public byte[] encode(SerializerFeature...features) { + final String json = JSON.toJSONString(this, features); + return json.getBytes(CHARSET_UTF8); + } + public String toJson() { return toJson(false); } diff --git a/remoting/src/test/java/org/apache/rocketmq/remoting/protocol/RemotingSerializableTest.java b/remoting/src/test/java/org/apache/rocketmq/remoting/protocol/RemotingSerializableTest.java index 3e8b7a90ae6..b70e23acecd 100644 --- a/remoting/src/test/java/org/apache/rocketmq/remoting/protocol/RemotingSerializableTest.java +++ b/remoting/src/test/java/org/apache/rocketmq/remoting/protocol/RemotingSerializableTest.java @@ -16,9 +16,19 @@ */ package org.apache.rocketmq.remoting.protocol; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.TypeAdapter; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.nio.charset.Charset; import java.util.Arrays; +import java.util.HashMap; import java.util.List; -import org.junit.Test; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; @@ -80,6 +90,38 @@ public void setStringList(List stringList) { "}"); } + @Test + public void testEncode() { + class Foo extends RemotingSerializable { + Map map = new HashMap<>(); + + Foo() { + map.put(0L, "Test"); + } + + public Map getMap() { + return map; + } + } + Foo foo = new Foo(); + String invalid = new String(foo.encode(), Charset.defaultCharset()); + String valid = new String(foo.encode(SerializerFeature.BrowserCompatible, SerializerFeature.QuoteFieldNames, + SerializerFeature.MapSortField), Charset.defaultCharset()); + + Gson gson = new Gson(); + final TypeAdapter strictAdapter = gson.getAdapter(JsonElement.class); + try { + strictAdapter.fromJson(invalid); + Assert.fail("Should have thrown"); + } catch (IOException ignore) { + } + + try { + strictAdapter.fromJson(valid); + } catch (IOException ignore) { + Assert.fail("Should not throw"); + } + } } class Sample {