Skip to content

Commit 65121e4

Browse files
committed
improve ser
1 parent d98ebce commit 65121e4

12 files changed

Lines changed: 424 additions & 51 deletions

File tree

demo/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
<dependency>
5050
<groupId>com.jsoniter</groupId>
5151
<artifactId>jsoniter</artifactId>
52-
<version>0.9.4-SNAPSHOT</version>
52+
<version>0.9.6-SNAPSHOT</version>
5353
</dependency>
5454
<dependency>
5555
<groupId>org.openjdk.jmh</groupId>

demo/src/test/java/com/jsoniter/demo/ObjectOutput.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33

44
import com.dslplatform.json.CompiledJson;
55
import com.dslplatform.json.DslJson;
6+
import com.dslplatform.json.JsonWriter;
67
import com.fasterxml.jackson.core.JsonGenerator;
78
import com.fasterxml.jackson.databind.ObjectMapper;
89
import com.jsoniter.output.EncodingMode;
910
import com.jsoniter.output.JsonStream;
1011
import com.jsoniter.spi.TypeLiteral;
12+
import json.ExternalSerialization;
1113
import org.junit.Test;
1214
import org.openjdk.jmh.Main;
1315
import org.openjdk.jmh.annotations.*;
@@ -27,6 +29,7 @@ public class ObjectOutput {
2729
private DslJson dslJson;
2830
private TestObject testObject;
2931
private TypeLiteral typeLiteral;
32+
private JsonWriter jsonWriter;
3033

3134
@CompiledJson
3235
public static class TestObject {
@@ -68,6 +71,7 @@ public void benchSetup(BenchmarkParams params) {
6871
testObject.field1 = "hello";
6972
testObject.field2 = "world";
7073
typeLiteral = TypeLiteral.create(TestObject.class);
74+
jsonWriter = new JsonWriter();
7175
}
7276

7377
@Benchmark
@@ -78,20 +82,22 @@ public void jsoniter() throws IOException {
7882
stream.flush();
7983
}
8084

81-
@Benchmark
85+
// @Benchmark
8286
public void jsoniter_easy_mode(Blackhole bh) throws IOException {
8387
bh.consume(JsonStream.serialize(testObject));
8488
}
8589

86-
@Benchmark
90+
// @Benchmark
8791
public void jackson() throws IOException {
8892
baos.reset();
8993
objectMapper.writeValue(baos, testObject);
9094
}
9195

92-
@Benchmark
96+
// @Benchmark
9397
public void dsljson() throws IOException {
9498
baos.reset();
95-
dslJson.serialize(testObject, baos);
99+
jsonWriter.reset();
100+
ExternalSerialization.serialize(testObject, jsonWriter, false);
101+
jsonWriter.toStream(baos);
96102
}
97103
}
Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
/*
2+
* Created by DSL Platform
3+
* v1.7.6214.30238
4+
*/
5+
6+
package json;
7+
8+
9+
10+
public class ExternalSerialization implements com.dslplatform.json.Configuration {
11+
12+
13+
@SuppressWarnings("unchecked")
14+
public void configure(final com.dslplatform.json.DslJson json) {
15+
setup(json);
16+
}
17+
18+
@SuppressWarnings("unchecked")
19+
public static void setup(final com.dslplatform.json.DslJson json) {
20+
21+
22+
json.registerReader(com.jsoniter.demo.ObjectOutput.TestObject.class, JSON_READER_struct0);
23+
json.registerWriter(com.jsoniter.demo.ObjectOutput.TestObject.class, new com.dslplatform.json.JsonWriter.WriteObject<com.jsoniter.demo.ObjectOutput.TestObject>() {
24+
@Override
25+
public void write(com.dslplatform.json.JsonWriter writer, com.jsoniter.demo.ObjectOutput.TestObject value) {
26+
serialize(value, writer, json.omitDefaults);
27+
}
28+
});
29+
30+
json.registerReader(com.jsoniter.demo.SimpleObjectBinding.TestObject.class, JSON_READER_struct1);
31+
json.registerWriter(com.jsoniter.demo.SimpleObjectBinding.TestObject.class, new com.dslplatform.json.JsonWriter.WriteObject<com.jsoniter.demo.SimpleObjectBinding.TestObject>() {
32+
@Override
33+
public void write(com.dslplatform.json.JsonWriter writer, com.jsoniter.demo.SimpleObjectBinding.TestObject value) {
34+
serialize(value, writer, json.omitDefaults);
35+
}
36+
});
37+
}
38+
39+
public static void serialize(final com.jsoniter.demo.ObjectOutput.TestObject self, final com.dslplatform.json.JsonWriter sw, final boolean minimal) {
40+
sw.writeByte(com.dslplatform.json.JsonWriter.OBJECT_START);
41+
if (minimal) {
42+
__serializeJsonObjectMinimal(self, sw, false);
43+
} else {
44+
__serializeJsonObjectFull(self, sw, false);
45+
}
46+
sw.writeByte(com.dslplatform.json.JsonWriter.OBJECT_END);
47+
}
48+
49+
static void __serializeJsonObjectMinimal(final com.jsoniter.demo.ObjectOutput.TestObject self, com.dslplatform.json.JsonWriter sw, boolean hasWrittenProperty) {
50+
51+
52+
if (self.field1 != null) {
53+
hasWrittenProperty = true;
54+
sw.writeAscii("\"field1\":", 9);
55+
sw.writeString(self.field1);
56+
}
57+
58+
if (self.field2 != null) {
59+
if(hasWrittenProperty) sw.writeByte(com.dslplatform.json.JsonWriter.COMMA);
60+
hasWrittenProperty = true;
61+
sw.writeAscii("\"field2\":", 9);
62+
sw.writeString(self.field2);
63+
}
64+
}
65+
66+
static void __serializeJsonObjectFull(final com.jsoniter.demo.ObjectOutput.TestObject self, com.dslplatform.json.JsonWriter sw, boolean hasWrittenProperty) {
67+
68+
69+
70+
if (self.field1 != null) {
71+
sw.writeAscii("\"field1\":", 9);
72+
sw.writeString(self.field1);
73+
} else {
74+
sw.writeAscii("\"field1\":null", 13);
75+
}
76+
77+
78+
if (self.field2 != null) {
79+
sw.writeAscii(",\"field2\":", 10);
80+
sw.writeString(self.field2);
81+
} else {
82+
sw.writeAscii(",\"field2\":null", 14);
83+
}
84+
}
85+
86+
public static final com.dslplatform.json.JsonReader.ReadObject<com.jsoniter.demo.ObjectOutput.TestObject> JSON_READER_struct0 = new com.dslplatform.json.JsonReader.ReadObject<com.jsoniter.demo.ObjectOutput.TestObject>() {
87+
@SuppressWarnings("unchecked")
88+
@Override
89+
public com.jsoniter.demo.ObjectOutput.TestObject read(final com.dslplatform.json.JsonReader reader) throws java.io.IOException {
90+
if(reader.last() != '{') {
91+
throw new java.io.IOException("Expecting \'{\' at position " + reader.positionInStream() + ". Found " + (char)reader.last());
92+
}
93+
reader.getNextToken();
94+
final com.jsoniter.demo.ObjectOutput.TestObject instance = new com.jsoniter.demo.ObjectOutput.TestObject();
95+
deserialize(instance, reader);
96+
return instance;
97+
}
98+
};
99+
100+
@SuppressWarnings("unchecked")
101+
static com.jsoniter.demo.ObjectOutput.TestObject deserializestruct0(final com.dslplatform.json.JsonReader reader) throws java.io.IOException {
102+
final com.jsoniter.demo.ObjectOutput.TestObject instance = new com.jsoniter.demo.ObjectOutput.TestObject();
103+
deserialize(instance, reader);
104+
return instance;
105+
}
106+
107+
@SuppressWarnings("unchecked")
108+
static void deserialize(final com.jsoniter.demo.ObjectOutput.TestObject instance, final com.dslplatform.json.JsonReader reader) throws java.io.IOException {
109+
110+
String _field1_ = null;
111+
String _field2_ = null;
112+
byte nextToken = reader.last();
113+
if(nextToken != '}') {
114+
int nameHash = reader.fillName();
115+
nextToken = reader.getNextToken();
116+
if(nextToken == 'n') {
117+
if (reader.wasNull()) {
118+
nextToken = reader.getNextToken();
119+
} else {
120+
throw new java.io.IOException("Expecting 'u' (as null) at position " + reader.positionInStream() + ". Found " + (char)nextToken);
121+
}
122+
} else {
123+
switch(nameHash) {
124+
125+
case 1212206434:
126+
_field1_ = com.dslplatform.json.StringConverter.deserialize(reader);
127+
nextToken = reader.getNextToken();
128+
break;
129+
case 1195428815:
130+
_field2_ = com.dslplatform.json.StringConverter.deserialize(reader);
131+
nextToken = reader.getNextToken();
132+
break;
133+
default:
134+
nextToken = reader.skip();
135+
break;
136+
}
137+
}
138+
while (nextToken == ',') {
139+
nextToken = reader.getNextToken();
140+
nameHash = reader.fillName();
141+
nextToken = reader.getNextToken();
142+
if(nextToken == 'n') {
143+
if (reader.wasNull()) {
144+
nextToken = reader.getNextToken();
145+
continue;
146+
} else {
147+
throw new java.io.IOException("Expecting 'u' (as null) at position " + reader.positionInStream() + ". Found " + (char)nextToken);
148+
}
149+
}
150+
switch(nameHash) {
151+
152+
case 1212206434:
153+
_field1_ = com.dslplatform.json.StringConverter.deserialize(reader);
154+
nextToken = reader.getNextToken();
155+
break;
156+
case 1195428815:
157+
_field2_ = com.dslplatform.json.StringConverter.deserialize(reader);
158+
nextToken = reader.getNextToken();
159+
break;
160+
default:
161+
nextToken = reader.skip();
162+
break;
163+
}
164+
}
165+
if (nextToken != '}') {
166+
throw new java.io.IOException("Expecting '}' at position " + reader.positionInStream() + ". Found " + (char)nextToken);
167+
}
168+
}
169+
170+
instance.field1 = _field1_;
171+
instance.field2 = _field2_;
172+
}
173+
174+
public static void serialize(final com.jsoniter.demo.SimpleObjectBinding.TestObject self, final com.dslplatform.json.JsonWriter sw, final boolean minimal) {
175+
sw.writeByte(com.dslplatform.json.JsonWriter.OBJECT_START);
176+
if (minimal) {
177+
__serializeJsonObjectMinimal(self, sw, false);
178+
} else {
179+
__serializeJsonObjectFull(self, sw, false);
180+
}
181+
sw.writeByte(com.dslplatform.json.JsonWriter.OBJECT_END);
182+
}
183+
184+
static void __serializeJsonObjectMinimal(final com.jsoniter.demo.SimpleObjectBinding.TestObject self, com.dslplatform.json.JsonWriter sw, boolean hasWrittenProperty) {
185+
186+
187+
if (self.field1 != 0) {
188+
hasWrittenProperty = true;
189+
sw.writeAscii("\"field1\":", 9);
190+
com.dslplatform.json.NumberConverter.serialize(self.field1, sw);
191+
}
192+
193+
if (self.field2 != 0) {
194+
if(hasWrittenProperty) sw.writeByte(com.dslplatform.json.JsonWriter.COMMA);
195+
hasWrittenProperty = true;
196+
sw.writeAscii("\"field2\":", 9);
197+
com.dslplatform.json.NumberConverter.serialize(self.field2, sw);
198+
}
199+
}
200+
201+
static void __serializeJsonObjectFull(final com.jsoniter.demo.SimpleObjectBinding.TestObject self, com.dslplatform.json.JsonWriter sw, boolean hasWrittenProperty) {
202+
203+
204+
205+
sw.writeAscii("\"field1\":", 9);
206+
com.dslplatform.json.NumberConverter.serialize(self.field1, sw);
207+
208+
209+
sw.writeAscii(",\"field2\":", 10);
210+
com.dslplatform.json.NumberConverter.serialize(self.field2, sw);
211+
}
212+
213+
public static final com.dslplatform.json.JsonReader.ReadObject<com.jsoniter.demo.SimpleObjectBinding.TestObject> JSON_READER_struct1 = new com.dslplatform.json.JsonReader.ReadObject<com.jsoniter.demo.SimpleObjectBinding.TestObject>() {
214+
@SuppressWarnings("unchecked")
215+
@Override
216+
public com.jsoniter.demo.SimpleObjectBinding.TestObject read(final com.dslplatform.json.JsonReader reader) throws java.io.IOException {
217+
if(reader.last() != '{') {
218+
throw new java.io.IOException("Expecting \'{\' at position " + reader.positionInStream() + ". Found " + (char)reader.last());
219+
}
220+
reader.getNextToken();
221+
final com.jsoniter.demo.SimpleObjectBinding.TestObject instance = new com.jsoniter.demo.SimpleObjectBinding.TestObject();
222+
deserialize(instance, reader);
223+
return instance;
224+
}
225+
};
226+
227+
@SuppressWarnings("unchecked")
228+
static com.jsoniter.demo.SimpleObjectBinding.TestObject deserializestruct1(final com.dslplatform.json.JsonReader reader) throws java.io.IOException {
229+
final com.jsoniter.demo.SimpleObjectBinding.TestObject instance = new com.jsoniter.demo.SimpleObjectBinding.TestObject();
230+
deserialize(instance, reader);
231+
return instance;
232+
}
233+
234+
@SuppressWarnings("unchecked")
235+
static void deserialize(final com.jsoniter.demo.SimpleObjectBinding.TestObject instance, final com.dslplatform.json.JsonReader reader) throws java.io.IOException {
236+
237+
int _field1_ = 0;
238+
int _field2_ = 0;
239+
byte nextToken = reader.last();
240+
if(nextToken != '}') {
241+
int nameHash = reader.fillName();
242+
nextToken = reader.getNextToken();
243+
if(nextToken == 'n') {
244+
if (reader.wasNull()) {
245+
nextToken = reader.getNextToken();
246+
} else {
247+
throw new java.io.IOException("Expecting 'u' (as null) at position " + reader.positionInStream() + ". Found " + (char)nextToken);
248+
}
249+
} else {
250+
switch(nameHash) {
251+
252+
case 1212206434:
253+
_field1_ = com.dslplatform.json.NumberConverter.deserializeInt(reader);
254+
nextToken = reader.getNextToken();
255+
break;
256+
case 1195428815:
257+
_field2_ = com.dslplatform.json.NumberConverter.deserializeInt(reader);
258+
nextToken = reader.getNextToken();
259+
break;
260+
default:
261+
nextToken = reader.skip();
262+
break;
263+
}
264+
}
265+
while (nextToken == ',') {
266+
nextToken = reader.getNextToken();
267+
nameHash = reader.fillName();
268+
nextToken = reader.getNextToken();
269+
if(nextToken == 'n') {
270+
if (reader.wasNull()) {
271+
nextToken = reader.getNextToken();
272+
continue;
273+
} else {
274+
throw new java.io.IOException("Expecting 'u' (as null) at position " + reader.positionInStream() + ". Found " + (char)nextToken);
275+
}
276+
}
277+
switch(nameHash) {
278+
279+
case 1212206434:
280+
_field1_ = com.dslplatform.json.NumberConverter.deserializeInt(reader);
281+
nextToken = reader.getNextToken();
282+
break;
283+
case 1195428815:
284+
_field2_ = com.dslplatform.json.NumberConverter.deserializeInt(reader);
285+
nextToken = reader.getNextToken();
286+
break;
287+
default:
288+
nextToken = reader.skip();
289+
break;
290+
}
291+
}
292+
if (nextToken != '}') {
293+
throw new java.io.IOException("Expecting '}' at position " + reader.positionInStream() + ". Found " + (char)nextToken);
294+
}
295+
}
296+
297+
instance.field1 = _field1_;
298+
instance.field2 = _field2_;
299+
}
300+
}

src/main/java/com/jsoniter/Codegen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ private synchronized static Decoder gen(String cacheKey, Type type) {
9292
JsoniterSpi.addNewDecoder(cacheKey, decoder);
9393
return decoder;
9494
} catch (Exception e) {
95-
System.err.println("failed to generate decoder for: " + type + " with " + Arrays.toString(typeArgs));
95+
System.err.println("failed to generate decoder for: " + type + " with " + Arrays.toString(typeArgs) + ", exception: " + e);
9696
System.err.println(source);
9797
throw new JsonException(e);
9898
}

src/main/java/com/jsoniter/output/Codegen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ private static synchronized Encoder gen(String cacheKey, Type type) {
129129
JsoniterSpi.addNewEncoder(cacheKey, encoder);
130130
return encoder;
131131
} catch (Exception e) {
132-
System.err.println("failed to generate encoder for: " + type + " with " + Arrays.toString(typeArgs));
132+
System.err.println("failed to generate encoder for: " + type + " with " + Arrays.toString(typeArgs) + ", exception: " + e);
133133
System.err.println(source);
134134
JsoniterSpi.dump();
135135
throw new JsonException(e);

src/main/java/com/jsoniter/output/CodegenAccess.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ public static void writeVal(String cacheKey, double obj, JsonStream stream) thro
5252
encoder.encodeDouble(obj, stream);
5353
}
5454

55+
public static void writeStringWithoutQuote(JsonStream stream, String val) throws IOException {
56+
StreamImplString.writeString(stream, val);
57+
}
58+
5559
public static void staticGenEncoders(TypeLiteral[] typeLiterals) {
5660
Codegen.staticGenEncoders(typeLiterals);
5761
}

0 commit comments

Comments
 (0)