diff --git a/src/main/java/net/woggioni/worth/serialization/binary/BinaryMarker.java b/src/main/java/net/woggioni/worth/serialization/binary/BinaryMarker.java index 147b35a..848315e 100644 --- a/src/main/java/net/woggioni/worth/serialization/binary/BinaryMarker.java +++ b/src/main/java/net/woggioni/worth/serialization/binary/BinaryMarker.java @@ -15,8 +15,8 @@ public enum BinaryMarker { EmptyArray(0xaf), LargeArray(0xff); - public byte value; + public int value; BinaryMarker(int b) { - value = (byte) b; + value = b; } } diff --git a/src/main/java/net/woggioni/worth/serialization/binary/JBONDumper.java b/src/main/java/net/woggioni/worth/serialization/binary/JBONDumper.java index 4c0aa1e..fb6f35c 100644 --- a/src/main/java/net/woggioni/worth/serialization/binary/JBONDumper.java +++ b/src/main/java/net/woggioni/worth/serialization/binary/JBONDumper.java @@ -94,6 +94,8 @@ public class JBONDumper extends ValueDumper { protected void beginObject(int size) { if(size == 0) { os.write(BinaryMarker.EmptyObject.value); + } else if(size < BinaryMarker.LargeObject.value - BinaryMarker.EmptyObject.value) { + os.write(BinaryMarker.EmptyObject.value + size); } else { os.write(BinaryMarker.LargeObject.value); Leb128.encode(os, size); @@ -110,6 +112,8 @@ public class JBONDumper extends ValueDumper { protected void beginArray(int size) { if(size == 0) { os.write(BinaryMarker.EmptyArray.value); + } else if(size < BinaryMarker.LargeArray.value - BinaryMarker.EmptyArray.value) { + os.write(BinaryMarker.EmptyArray.value + size); } else { os.write(BinaryMarker.LargeArray.value); Leb128.encode(os, size); @@ -135,10 +139,15 @@ public class JBONDumper extends ValueDumper { if(value.isEmpty()) { os.write(BinaryMarker.EmptyString.value); } else { - os.write(BinaryMarker.LargeString.value); byte[] bytes = value.getBytes(); - Leb128.encode(os, bytes.length); - os.write(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); + os.write(value.getBytes()); + } } } diff --git a/src/main/java/net/woggioni/worth/serialization/binary/JBONParser.java b/src/main/java/net/woggioni/worth/serialization/binary/JBONParser.java index 037c76c..56b56d6 100644 --- a/src/main/java/net/woggioni/worth/serialization/binary/JBONParser.java +++ b/src/main/java/net/woggioni/worth/serialization/binary/JBONParser.java @@ -47,43 +47,49 @@ public class JBONParser extends ValueParser { String text = new String(buffer); objectKey(text); } - byte b; - { - int c = stream.read(); - if(c == -1) { - break; - } - b = (byte) c; + int c = stream.read(); + if(c == -1) { + break; } - if(b == BinaryMarker.Null.value) { + if(c == BinaryMarker.Null.value) { nullValue(); - } else if(b == BinaryMarker.True.value) { + } else if(c == BinaryMarker.True.value) { booleanValue(true); - } else if(b == BinaryMarker.False.value) { + } else if(c == BinaryMarker.False.value) { booleanValue(false); - } else if(b == BinaryMarker.Int.value) { + } else if(c == BinaryMarker.Int.value) { integerValue(decoder.decode()); - } else if(b == BinaryMarker.Float.value) { + } else if(c == BinaryMarker.Float.value) { floatValue(decoder.decodeDouble()); - } else if(b == BinaryMarker.EmptyString.value) { + } else if(c == BinaryMarker.EmptyString.value) { 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()]; stream.read(buffer); String text = new String(buffer); stringValue(text); - } else if(b == BinaryMarker.EmptyArray.value) { + } else if(c == BinaryMarker.EmptyArray.value) { 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(); beginArray(size); - } else if(b == BinaryMarker.EmptyObject.value) { + } else if(c == BinaryMarker.EmptyObject.value) { 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(); beginObject(size); } 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) { if ((osl = WorthUtils.dynamicCast(stack.getFirst(), ObjectStackLevel.class)) != null