对一个含有byte[]成员的对象进行json序列化的时候,出现两个问题:
一个是在#2574里已经提到过的高版本序列化和低版本反序列化不兼容的问题,高版本会对byte[]进行16进制序列化,低版本用的是base64,导致高低版本无法互相兼容;
另一个是当byte[]长度到达一定长度时,会发生越界,具体如下:
在com.alibaba.fastjson.serializer.SerializeWriter#writeHex中:
int newcount = count + bytes.length * 2 + 3;
if (newcount > buf.length) {
if (writer != null) {
char[] chars = new char[bytes.length + 3];// 1
int pos = 0;
chars[pos++] = 'x';
chars[pos++] = '\'';
for (int i = 0; i < bytes.length; ++i) {
byte b = bytes[i];
int a = b & 0xFF;
int b0 = a >> 4;
int b1 = a & 0xf;
chars[pos++] = (char) (b0 + (b0 < 10 ? 48 : 55));
chars[pos++] = (char) (b1 + (b1 < 10 ? 48 : 55));//2
}
chars[pos++] = '\'';
try {
writer.write(chars);
} catch (IOException ex) {
throw new JSONException("writeBytes error.", ex);
}
return;
}
expandCapacity(newcount);
}
[1]这里chars的长度只有bytes的长度多3,但每一次循环中bytes读一个,chars都会写两个([2]),所以遍历到bytes一半的时候就会越界了。
1条答案
按热度按时间iklwldmw1#
提了个pr尝试修了这个问题,用测例跑了应该没啥问题,楼上那位朋友 Omega-Ariston 少改个地方,有点问题。