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 {