Skip to content

Commit

Permalink
bug fix for ObjectWriterCreatorLambda enum mixin, for issue #703
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Aug 26, 2022
1 parent d01da80 commit 557d181
Show file tree
Hide file tree
Showing 4 changed files with 180 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.alibaba.fastjson2.benchmark;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONB;
import com.alibaba.fastjson2.JSONWriter;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.IOUtils;
import org.openjdk.jmh.annotations.Benchmark;
Expand All @@ -17,12 +19,18 @@

public class CartTree {
static String str;
static byte[] jsonbBytes;
static ObjectMapper mapper = new ObjectMapper();

public CartTree() {
try {
InputStream is = CartTree.class.getClassLoader().getResourceAsStream("data/cart.json");
str = IOUtils.toString(is, "UTF-8");

jsonbBytes = JSONB.toBytes(
JSON.parseObject(str, Map.class),
JSONWriter.Feature.WriteNameAsSymbol
);
} catch (Exception ex) {
ex.printStackTrace();
}
Expand All @@ -42,6 +50,20 @@ public void fastjson2(Blackhole bh) {
);
}

@Benchmark
public void wastjson(Blackhole bh) {
bh.consume(
io.github.wycst.wast.json.JSON.parseObject(str, Map.class)
);
}

@Benchmark
public void fastjson2_jsonb(Blackhole bh) {
bh.consume(
JSONB.parseObject(jsonbBytes, Map.class)
);
}

@Benchmark
public void jackson(Blackhole bh) throws Exception {
bh.consume(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
import static com.alibaba.fastjson2.benchmark.JMH.BH;

public class CartTreeTest {
public static void fastjson2_perf_test() {
static final CartTree benchmark = new CartTree();

public static void fastjson2_test() {
for (int i = 0; i < 10; i++) {
fastjson2_perf();
fastjson2();
}
}

public static void fastjson2_perf() {
CartTree benchmark = new CartTree();

public static void fastjson2() {
long start = System.currentTimeMillis();
for (int i = 0; i < 1000 * 10; ++i) {
benchmark.fastjson2(BH);
Expand All @@ -32,15 +32,40 @@ public static void fastjson2_perf() {
// oracle-jdk-18.0.2 :
}

public static void jackson_perf_test() throws Exception {
public static void fastjson2_jsonb_test() {
for (int i = 0; i < 10; i++) {
jackson_perf();
fastjson2_jsonb();
}
}

public static void jackson_perf() throws Exception {
CartTree benchmark = new CartTree();
public static void fastjson2_jsonb() {
long start = System.currentTimeMillis();
for (int i = 0; i < 1000 * 10; ++i) {
benchmark.fastjson2_jsonb(BH);
}
long millis = System.currentTimeMillis() - start;
System.out.println("CartTree-fastjson2 : " + millis);

// zulu8.62.0.19 : 940
// zulu11.52.13 : 1112
// zulu17.32.13 : 1060
// zulu18.28.13 :
// zulu19.0.47 :
// corretto-8 :
// corretto-11 :
// corretto-17 :
// corretto-18 :
// oracle-jdk-17.0.4 :
// oracle-jdk-18.0.2 :
}

public static void jackson_test() throws Exception {
for (int i = 0; i < 10; i++) {
jackson();
}
}

public static void jackson() throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < 1000 * 10; ++i) {
benchmark.jackson(BH);
Expand All @@ -59,9 +84,36 @@ public static void jackson_perf() throws Exception {
// oracle-jdk-17.0.4 :
// oracle-jdk-18.0.2 :
}
public static void wastjson_test() throws Exception {
for (int i = 0; i < 10; i++) {
wastjson();
}
}

public static void wastjson() throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < 1000 * 10; ++i) {
benchmark.wastjson(BH);
}
long millis = System.currentTimeMillis() - start;
System.out.println("CartTree-wastjson : " + millis);
// zulu8.62.0.19 : 869
// zulu11.52.13 :
// zulu17.32.13 : 1139
// zulu18.28.13 :
// zulu19.0.47 :
// corretto-8 :
// corretto-11 :
// corretto-17 :
// corretto-18 :
// oracle-jdk-17.0.4 :
// oracle-jdk-18.0.2 :
}

public static void main(String[] args) throws Exception {
fastjson2_perf_test();
fastjson2_test();
// fastjson2_jsonb_test();
// jackson_perf_test();
// wastjson_test();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,12 @@ public ObjectWriter createObjectWriter(
long features,
final List<ObjectWriterModule> modules
) {
ObjectWriterProvider provider = null;
final ObjectWriterProvider provider;
ObjectWriterProvider p = null;
BeanInfo beanInfo = new BeanInfo();
for (ObjectWriterModule module : modules) {
if (provider == null) {
provider = module.getProvider();
if (p == null) {
p = module.getProvider();
}

ObjectWriterAnnotationProcessor annotationProcessor = module.getAnnotationProcessor();
Expand All @@ -168,6 +169,7 @@ public ObjectWriter createObjectWriter(
}
annotationProcessor.getBeanInfo(beanInfo, objectClass);
}
provider = p;

if (beanInfo.serializer != null && ObjectWriter.class.isAssignableFrom(beanInfo.serializer)) {
try {
Expand Down Expand Up @@ -296,7 +298,7 @@ public ObjectWriter createObjectWriter(

FieldWriter fieldWriter
= createFieldWriter(
null,
provider,
objectClass,
fieldName,
fieldInfo.ordinal,
Expand Down
92 changes: 90 additions & 2 deletions core/src/test/java/com/alibaba/fastjson2/issues/Issue703.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,12 @@
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.annotation.JSONField;
import com.alibaba.fastjson2.reader.ObjectReader;
import com.alibaba.fastjson2.reader.ObjectReaderCreator;
import com.alibaba.fastjson2.reader.ObjectReaderCreatorLambda;
import com.alibaba.fastjson2.reader.ObjectReaderProvider;
import com.alibaba.fastjson2.writer.ObjectWriter;
import com.alibaba.fastjson2.writer.ObjectWriterCreator;
import com.alibaba.fastjson2.writer.ObjectWriterCreatorLambda;
import com.alibaba.fastjson2.writer.ObjectWriterProvider;
import org.junit.jupiter.api.Test;

Expand All @@ -28,8 +32,8 @@ public void test() {
assertEquals("{\"int32\":10,\"int64\":100}", json);

Bean tt = read(json, Bean.class);
System.out.println(tt.int32);
System.out.println(tt.int64);
assertEquals(t.int32, tt.int32);
assertEquals(t.int64, tt.int64);
}

public <T> T read(String json, Type type) {
Expand Down Expand Up @@ -60,6 +64,90 @@ public String write(Object value) {
}
}

@Test
public void test1() {
Bean t = new Bean();
t.setInt32(Misc.IntEnum.CLOSE);
t.setInt64(Misc.LongEnum.HIGH);

String json = write1(t);
assertEquals("{\"int32\":10,\"int64\":100}", json);

Bean tt = read1(json, Bean.class);
assertEquals(t.int32, tt.int32);
assertEquals(t.int64, tt.int64);
}

public <T> T read1(String json, Type type) {
ObjectReaderProvider readers = new ObjectReaderProvider(ObjectReaderCreatorLambda.INSTANCE);
readers.mixIn(Misc.PersistentEnum.class, PersistentEnumMixin.class);
JSONReader.Context context = new JSONReader.Context(readers);
try (final JSONReader reader = JSONReader.of(context, json)) {
ObjectReader<T> v = reader.getObjectReader(type);
return v.readObject(reader, 0);
}
}

public String write1(Object value) {
ObjectWriterProvider writers = new ObjectWriterProvider(ObjectWriterCreatorLambda.INSTANCE);
writers.mixIn(Misc.PersistentEnum.class, PersistentEnumMixin.class);
JSONWriter.Context context = new JSONWriter.Context(writers);
try (final JSONWriter writer = JSONWriter.of(context)) {
if (value == null) {
writer.writeNull();
} else {
context.config(WriteNonStringKeyAsString);
context.config(WriteNulls);
final Class<?> clazz = value.getClass();
ObjectWriter<?> v = writer.getObjectWriter(clazz, clazz);
v.write(writer, value, null, null, 0);
}
return writer.toString();
}
}

@Test
public void test2() {
Bean t = new Bean();
t.setInt32(Misc.IntEnum.CLOSE);
t.setInt64(Misc.LongEnum.HIGH);

String json = write2(t);
assertEquals("{\"int32\":10,\"int64\":100}", json);

Bean tt = read2(json, Bean.class);
assertEquals(t.int32, tt.int32);
assertEquals(t.int64, tt.int64);
}

public <T> T read2(String json, Type type) {
ObjectReaderProvider readers = new ObjectReaderProvider(ObjectReaderCreator.INSTANCE);
readers.mixIn(Misc.PersistentEnum.class, PersistentEnumMixin.class);
JSONReader.Context context = new JSONReader.Context(readers);
try (final JSONReader reader = JSONReader.of(context, json)) {
ObjectReader<T> v = reader.getObjectReader(type);
return v.readObject(reader, 0);
}
}

public String write2(Object value) {
ObjectWriterProvider writers = new ObjectWriterProvider(ObjectWriterCreator.INSTANCE);
writers.mixIn(Misc.PersistentEnum.class, PersistentEnumMixin.class);
JSONWriter.Context context = new JSONWriter.Context(writers);
try (final JSONWriter writer = JSONWriter.of(context)) {
if (value == null) {
writer.writeNull();
} else {
context.config(WriteNonStringKeyAsString);
context.config(WriteNulls);
final Class<?> clazz = value.getClass();
ObjectWriter<?> v = writer.getObjectWriter(clazz, clazz);
v.write(writer, value, null, null, 0);
}
return writer.toString();
}
}

public static class Bean {
Misc.IntEnum int32;
Misc.LongEnum int64;
Expand Down

0 comments on commit 557d181

Please sign in to comment.