据我所知,DataInputStream是使用Modified-UTF8反序列化字符串的唯一方法。不幸的是,String的大小有限,因为长度是无符号的短。
使用Modified-UTF8的主要动机是Java 8不再允许3字节代理/ 6字节代理对,因此以下代码无法正常运行(在带有这些代理的字符串上):
String surrogatePairs = "\uD83C\uDFE0\uD83C\uDF4E\uD83D\uDCA9";
// Serialization process using 3-byte surrogates
String deserialized = new String(bytes, "UTF-8");
assertEquals(surrogatePairs, deserialized); // fails
但是,此代码可以正常运行:
ByteBuffer bb = ByteBuffer.allocate(len + 2);
bb.putShort((short) len).put(nonNullValue, offset, len);
ByteArrayInputStream bis = new ByteArrayInputStream(bb.array());
DataInputStream dis = new DataInputStream(bis);
assertEquals(surrogatePairs, dis.readUTF()); // OK
这种方法的问题在于对String的大小没有限制,因此如果String的长度超过unsigned short的长度,它将无法正常工作。
是否有另一种方法可以使用3字节代理项/ 6字节代理项对对字符串进行反序列化?编码的数据被保证为UTF-8,如果它解决了字符串超过Integer.MAX_VALUE / 2的任何问题。