improven JBON format using the marker byte to include the size of small
string,arrays or objects
This commit is contained in:
@@ -15,8 +15,8 @@ public enum BinaryMarker {
|
|||||||
EmptyArray(0xaf),
|
EmptyArray(0xaf),
|
||||||
LargeArray(0xff);
|
LargeArray(0xff);
|
||||||
|
|
||||||
public byte value;
|
public int value;
|
||||||
BinaryMarker(int b) {
|
BinaryMarker(int b) {
|
||||||
value = (byte) b;
|
value = b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -94,6 +94,8 @@ public class JBONDumper extends ValueDumper {
|
|||||||
protected void beginObject(int size) {
|
protected void beginObject(int size) {
|
||||||
if(size == 0) {
|
if(size == 0) {
|
||||||
os.write(BinaryMarker.EmptyObject.value);
|
os.write(BinaryMarker.EmptyObject.value);
|
||||||
|
} else if(size < BinaryMarker.LargeObject.value - BinaryMarker.EmptyObject.value) {
|
||||||
|
os.write(BinaryMarker.EmptyObject.value + size);
|
||||||
} else {
|
} else {
|
||||||
os.write(BinaryMarker.LargeObject.value);
|
os.write(BinaryMarker.LargeObject.value);
|
||||||
Leb128.encode(os, size);
|
Leb128.encode(os, size);
|
||||||
@@ -110,6 +112,8 @@ public class JBONDumper extends ValueDumper {
|
|||||||
protected void beginArray(int size) {
|
protected void beginArray(int size) {
|
||||||
if(size == 0) {
|
if(size == 0) {
|
||||||
os.write(BinaryMarker.EmptyArray.value);
|
os.write(BinaryMarker.EmptyArray.value);
|
||||||
|
} else if(size < BinaryMarker.LargeArray.value - BinaryMarker.EmptyArray.value) {
|
||||||
|
os.write(BinaryMarker.EmptyArray.value + size);
|
||||||
} else {
|
} else {
|
||||||
os.write(BinaryMarker.LargeArray.value);
|
os.write(BinaryMarker.LargeArray.value);
|
||||||
Leb128.encode(os, size);
|
Leb128.encode(os, size);
|
||||||
@@ -135,12 +139,17 @@ public class JBONDumper extends ValueDumper {
|
|||||||
if(value.isEmpty()) {
|
if(value.isEmpty()) {
|
||||||
os.write(BinaryMarker.EmptyString.value);
|
os.write(BinaryMarker.EmptyString.value);
|
||||||
} else {
|
} else {
|
||||||
os.write(BinaryMarker.LargeString.value);
|
|
||||||
byte[] bytes = value.getBytes();
|
byte[] bytes = value.getBytes();
|
||||||
|
if(bytes.length < BinaryMarker.LargeString.value - BinaryMarker.EmptyString.value) {
|
||||||
|
os.write(BinaryMarker.EmptyString.value + bytes.length);
|
||||||
|
os.write(value.getBytes());
|
||||||
|
} else {
|
||||||
|
os.write(BinaryMarker.LargeString.value);
|
||||||
Leb128.encode(os, bytes.length);
|
Leb128.encode(os, bytes.length);
|
||||||
os.write(value.getBytes());
|
os.write(value.getBytes());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
|
@@ -47,43 +47,49 @@ public class JBONParser extends ValueParser {
|
|||||||
String text = new String(buffer);
|
String text = new String(buffer);
|
||||||
objectKey(text);
|
objectKey(text);
|
||||||
}
|
}
|
||||||
byte b;
|
|
||||||
{
|
|
||||||
int c = stream.read();
|
int c = stream.read();
|
||||||
if(c == -1) {
|
if(c == -1) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
b = (byte) c;
|
if(c == BinaryMarker.Null.value) {
|
||||||
}
|
|
||||||
if(b == BinaryMarker.Null.value) {
|
|
||||||
nullValue();
|
nullValue();
|
||||||
} else if(b == BinaryMarker.True.value) {
|
} else if(c == BinaryMarker.True.value) {
|
||||||
booleanValue(true);
|
booleanValue(true);
|
||||||
} else if(b == BinaryMarker.False.value) {
|
} else if(c == BinaryMarker.False.value) {
|
||||||
booleanValue(false);
|
booleanValue(false);
|
||||||
} else if(b == BinaryMarker.Int.value) {
|
} else if(c == BinaryMarker.Int.value) {
|
||||||
integerValue(decoder.decode());
|
integerValue(decoder.decode());
|
||||||
} else if(b == BinaryMarker.Float.value) {
|
} else if(c == BinaryMarker.Float.value) {
|
||||||
floatValue(decoder.decodeDouble());
|
floatValue(decoder.decodeDouble());
|
||||||
} else if(b == BinaryMarker.EmptyString.value) {
|
} else if(c == BinaryMarker.EmptyString.value) {
|
||||||
stringValue("");
|
stringValue("");
|
||||||
} else if(b == BinaryMarker.LargeString.value) {
|
} else if(c > BinaryMarker.EmptyString.value &&
|
||||||
|
c < BinaryMarker.LargeString.value) {
|
||||||
|
byte[] buffer = new byte[c - BinaryMarker.EmptyString.value];
|
||||||
|
stream.read(buffer);
|
||||||
|
String text = new String(buffer);
|
||||||
|
stringValue(text);
|
||||||
|
} else if(c == BinaryMarker.LargeString.value) {
|
||||||
byte[] buffer = new byte[(int) decoder.decode()];
|
byte[] buffer = new byte[(int) decoder.decode()];
|
||||||
stream.read(buffer);
|
stream.read(buffer);
|
||||||
String text = new String(buffer);
|
String text = new String(buffer);
|
||||||
stringValue(text);
|
stringValue(text);
|
||||||
} else if(b == BinaryMarker.EmptyArray.value) {
|
} else if(c == BinaryMarker.EmptyArray.value) {
|
||||||
beginArray(0);
|
beginArray(0);
|
||||||
} else if(b == BinaryMarker.LargeArray.value) {
|
} else if(c > BinaryMarker.EmptyArray.value && c < BinaryMarker.LargeArray.value) {
|
||||||
|
beginArray(c - BinaryMarker.EmptyArray.value);
|
||||||
|
} else if(c == BinaryMarker.LargeArray.value) {
|
||||||
long size = decoder.decode();
|
long size = decoder.decode();
|
||||||
beginArray(size);
|
beginArray(size);
|
||||||
} else if(b == BinaryMarker.EmptyObject.value) {
|
} else if(c == BinaryMarker.EmptyObject.value) {
|
||||||
beginObject(0);
|
beginObject(0);
|
||||||
} else if(b == BinaryMarker.LargeObject.value) {
|
} else if(c > BinaryMarker.EmptyObject.value && c < BinaryMarker.LargeObject.value) {
|
||||||
|
beginObject(c - BinaryMarker.EmptyObject.value);
|
||||||
|
} else if(c == BinaryMarker.LargeObject.value) {
|
||||||
long size = decoder.decode();
|
long size = decoder.decode();
|
||||||
beginObject(size);
|
beginObject(size);
|
||||||
} else {
|
} else {
|
||||||
throw new ParseException(String.format("Illegal byte at position %d: 0x%02x", cursor, b));
|
throw new ParseException(String.format("Illegal byte at position %d: 0x%02x", cursor, c));
|
||||||
}
|
}
|
||||||
while(stack.size() > 0) {
|
while(stack.size() > 0) {
|
||||||
if ((osl = WorthUtils.dynamicCast(stack.getFirst(), ObjectStackLevel.class)) != null
|
if ((osl = WorthUtils.dynamicCast(stack.getFirst(), ObjectStackLevel.class)) != null
|
||||||
|
Reference in New Issue
Block a user