栏目:Java8基础 作者:admin 日期:2015-01-11 评论:0 点击: 2,307 次
下面给大家说一说BigInteger序列化操作,本节内容主要是阅读BigInteger序列化部分的源码,如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
private static final sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe(); private static final long signumOffset; private static final long magOffset; static { try { signumOffset = unsafe.objectFieldOffset(BigInteger.class.getDeclaredField("signum")); magOffset = unsafe.objectFieldOffset(BigInteger.class.getDeclaredField("mag")); } catch (Exception ex) { throw new Error(ex); } } private void readObject(ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { ObjectInputStream.GetField fields = s.readFields(); int sign = fields.get("signum", -2); byte[] magnitude = (byte[]) fields.get("magnitude", null); if (sign < -1 || sign > 1) { String message = "BigInteger: Invalid signum value"; if (fields.defaulted("signum")) { message = "BigInteger: Signum not present in stream"; } throw new java.io.StreamCorruptedException(message); } if ((magnitude.length == 0) != (sign == 0)) { String message = "BigInteger: signum-magnitude mismatch"; if (fields.defaulted("magnitude")) { message = "BigInteger: Magnitude not present in stream"; } throw new java.io.StreamCorruptedException(message); } unsafe.putIntVolatile(this, signumOffset, sign); unsafe.putObjectVolatile(this, magOffset, stripLeadingZeroBytes(magnitude)); } private void writeObject(ObjectOutputStream s) throws IOException { ObjectOutputStream.PutField fields = s.putFields(); fields.put("signum", signum); fields.put("magnitude", magSerializedForm()); fields.put("bitCount", -1); fields.put("bitLength", -1); fields.put("lowestSetBit", -2); fields.put("firstNonzeroByteNum", -2); s.writeFields(); } |
从上面代码已经看出来了,序列化的时候,把字段这个放到fields里面,而在反序列化的时候,从ObjectInputStream中读出数据,此时已经构建好了BigInteger,但是数据还没有填充好,最后是填写数据:
1 2 |
unsafe.putIntVolatile(this, signumOffset, sign); unsafe.putObjectVolatile(this, magOffset, stripLeadingZeroBytes(magnitude)); |
------====== 本站公告 ======------
金丝燕网,一个严谨的网站!