src/main/java/org/nustaq/serialization/FSTObjectInput.java
protected ObjectInputStream getObjectInputStream(final Class cl, final FSTClazzInfo clInfo, final FSTClazzInfo.FSTFieldInfo referencee, final Object toRead) throws IOException {
        ObjectInputStream wrapped = new ObjectInputStream() {
            @Override
            public Object readObjectOverride() throws IOException, ClassNotFoundException {
                try {
                    byte b = FSTObjectInput.this.readByte();
                    if ( b != FSTObjectOutput.SPECIAL_COMPATIBILITY_OBJECT_TAG ) {
                        Constructor<?>[] constructors = OptionalDataException.class.getDeclaredConstructors();
                        FSTObjectInput.this.pushBack(1);
                        for (int i = 0; i < constructors.length; i++) {
                            Constructor constructor = constructors[i];
                            Class[] typeParameters = constructor.getParameterTypes();
                            if ( typeParameters != null && typeParameters.length == 1 && typeParameters[0] == int.class) {
                                constructor.setAccessible(true);
                                OptionalDataException ode;
                                try {
                                    ode = (OptionalDataException) constructor.newInstance(0);
                                    throw ode;
                                } catch (InvocationTargetException e) {
                                    break;
                                }
                            }
                        }
                        throw new EOFException("if your code relies on this, think");
                    }
                    return FSTObjectInput.this.readObjectInternal(referencee.getPossibleClasses());
                } catch (IllegalAccessException e) {
                    throw new IOException(e);
                } catch (InstantiationException e) {
                    throw new IOException(e);
                }
            }

            @Override
            public Object readUnshared() throws IOException, ClassNotFoundException {
                try {
                    return FSTObjectInput.this.readObjectInternal(referencee.getPossibleClasses()); // fixme
                } catch (IllegalAccessException e) {
                    throw new IOException(e);
                } catch (InstantiationException e) {
                    throw new IOException(e);
                }
            }

            @Override
            public void defaultReadObject() throws IOException, ClassNotFoundException {
                try {
                    int tag = readByte();
                    if ( tag == 77 ) // came from writeFields
                    {
                        fieldMap = (HashMap<String, Object>) FSTObjectInput.this.readObjectInternal(HashMap.class);
                        // object has been written with writeFields, is no read with defaultReadObjects,
                        // need to autoapply map to object vars.
                        // this might be redundant in case readObject() pulls a getFields() .. (see bitset testcase)
                        for (Iterator<String> iterator = fieldMap.keySet().iterator(); iterator.hasNext(); ) {
                            String key = iterator.next();
                            FSTClazzInfo.FSTFieldInfo fieldInfo = clInfo.getFieldInfo(key, null);// in case fieldName is not unique => cannot recover/fix
                            if ( fieldInfo != null ) {
                                fieldInfo.setObjectValue(toRead,fieldMap.get(key));
                            }
                        }
                    } else {
                        FSTObjectInput.this.readObjectFields(
                                referencee,
                                clInfo,
                                clInfo.getCompInfo().get(cl).getFieldArray(),
                                toRead,
                                0,
                                0
                        ); // FIXME: only fields of current class
                    }
                } catch (Exception e) {
                    throw new IOException(e);
                }
            }

            HashMap<String, Object> fieldMap;

            @Override
            public GetField readFields() throws IOException, ClassNotFoundException {
                int tag = readByte();
                try {
                    FSTClazzInfo.FSTCompatibilityInfo fstCompatibilityInfo = clInfo.getCompInfo().get(cl);
                    if (tag==99) { // came from defaultwriteobject
                        // Note: in case number and names of instance fields of reader/writer are different,
                        // this fails as code below implicitely assumes, fields of writer == fields of reader
                        // unfortunately one can use defaultWriteObject at writer side but use getFields at reader side
                        // in readObject(). if then fields differ, code below reads BS and fails.
                        // Its impossible to fix that except by always using putField + getField for
                        // JDK compatibility classes, however this will waste lots of performance. As
                        // it would be necessary to *always* write full metainformation (a map of fieldName => value pairs)
                        // see #53
                        fieldMap = new HashMap<String, Object>();
                        FSTObjectInput.this.readCompatibleObjectFields(referencee, clInfo, fstCompatibilityInfo.getFieldArray(), fieldMap);
                        getCodec().readVersionTag(); // consume dummy version tag as created by defaultWriteObject
                    } else if (tag == 66) { // has been written from writeObjectCompatible without writeMethod
                        fieldMap = new HashMap<String, Object>();
                        FSTObjectInput.this.readCompatibleObjectFields(referencee, clInfo, fstCompatibilityInfo.getFieldArray(), fieldMap);
                        getCodec().readVersionTag(); // consume dummy version tag as created by defaultWriteObject
                    } else {
                        fieldMap = (HashMap<String, Object>) FSTObjectInput.this.readObjectInternal(HashMap.class);
                    }
                } catch (Exception e) {
                    FSTUtil.<RuntimeException>rethrow(e);
                }
                return new GetField() {
                    @Override
                    public ObjectStreamClass getObjectStreamClass() {
                        return ObjectStreamClass.lookup(cl);
                    }

                    @Override
                    public boolean defaulted(String name) throws IOException {
                        return fieldMap.get(name) == null;
                    }

                    @Override
                    public boolean get(String name, boolean val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Boolean) fieldMap.get(name)).booleanValue();
                    }

                    @Override
                    public byte get(String name, byte val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Byte) fieldMap.get(name)).byteValue();
                    }

                    @Override
                    public char get(String name, char val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Character) fieldMap.get(name)).charValue();
                    }

                    @Override
                    public short get(String name, short val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Short) fieldMap.get(name)).shortValue();
                    }

                    @Override
                    public int get(String name, int val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Integer) fieldMap.get(name)).intValue();
                    }

                    @Override
                    public long get(String name, long val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Long) fieldMap.get(name)).longValue();
                    }

                    @Override
                    public float get(String name, float val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Float) fieldMap.get(name)).floatValue();
                    }

                    @Override
                    public double get(String name, double val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Double) fieldMap.get(name)).doubleValue();
                    }

                    @Override
                    public Object get(String name, Object val) throws IOException {
                        Object res = fieldMap.get(name);
                        if (res == null) {
                            return val;
                        }
                        return res;
                    }
                };
            }

            @Override
            public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectException {
                if (callbacks == null) {
                    callbacks = new ArrayList<CallbackEntry>();
                }
                callbacks.add(new CallbackEntry(obj, prio));
            }

            @Override
            public int read() throws IOException {
                return getCodec().readFByte();
            }

            @Override
            public int read(byte[] buf, int off, int len) throws IOException {
                return FSTObjectInput.this.read(buf, off, len);
            }

            @Override
            public int available() throws IOException {
                return FSTObjectInput.this.available();
            }

            @Override
            public void close() throws IOException {
            }

            @Override
            public boolean readBoolean() throws IOException {
                return FSTObjectInput.this.readBoolean();
            }

            @Override
            public byte readByte() throws IOException {
                return getCodec().readFByte();
            }

            @Override
            public int readUnsignedByte() throws IOException {
                return FSTObjectInput.this.readUnsignedByte();
            }

            @Override
            public char readChar() throws IOException {
                return getCodec().readFChar();
            }

            @Override
            public short readShort() throws IOException {
                return getCodec().readFShort();
            }

            @Override
            public int readUnsignedShort() throws IOException {
                return FSTObjectInput.this.readUnsignedShort();
            }

            @Override
            public int readInt() throws IOException {
                return getCodec().readFInt();
            }

            @Override
            public long readLong() throws IOException {
                return getCodec().readFLong();
            }

            @Override
            public float readFloat() throws IOException {
                return getCodec().readFFloat();
            }

            @Override
            public double readDouble() throws IOException {
                return getCodec().readFDouble();
            }

            @Override
            public void readFully(byte[] buf) throws IOException {
                FSTObjectInput.this.readFully(buf);
            }

            @Override
            public void readFully(byte[] buf, int off, int len) throws IOException {
                FSTObjectInput.this.readFully(buf, off, len);
            }

            @Override
            public int skipBytes(int len) throws IOException {
                return FSTObjectInput.this.skipBytes(len);
            }

            @Override
            public String readUTF() throws IOException {
                return getCodec().readStringUTF();
            }

            @Override
            public String readLine() throws IOException {
                return FSTObjectInput.this.readLine();
            }

            @Override
            public int read(byte[] b) throws IOException {
                return FSTObjectInput.this.read(b);
            }

            @Override
            public long skip(long n) throws IOException {
                return FSTObjectInput.this.skip(n);
            }

            @Override
            public void mark(int readlimit) {
                throw new RuntimeException("not implemented");
            }

            @Override
            public void reset() throws IOException {
                FSTObjectInput.this.reset();
            }

            @Override
            public boolean markSupported() {
                return false;
            }
        };
        if ( fakeWrapper == null ) {
            fakeWrapper = new MyObjectStream();
        }
        fakeWrapper.push(wrapped);
        return fakeWrapper;
    }
protected ObjectInputStream getObjectInputStream(final Class cl, final FSTClazzInfo clInfo, final FSTClazzInfo.FSTFieldInfo referencee, final Object toRead) throws IOException {
        ObjectInputStream wrapped = new ObjectInputStream() {
            @Override
            public Object readObjectOverride() throws IOException, ClassNotFoundException {
                try {
                    byte b = FSTObjectInput.this.readByte();
                    if ( b != FSTObjectOutput.SPECIAL_COMPATIBILITY_OBJECT_TAG ) {
                        Constructor<?>[] constructors = OptionalDataException.class.getDeclaredConstructors();
                        FSTObjectInput.this.pushBack(1);
                        for (int i = 0; i < constructors.length; i++) {
                            Constructor constructor = constructors[i];
                            Class[] typeParameters = constructor.getParameterTypes();
                            if ( typeParameters != null && typeParameters.length == 1 && typeParameters[0] == int.class) {
                                constructor.setAccessible(true);
                                OptionalDataException ode;
                                try {
                                    ode = (OptionalDataException) constructor.newInstance(0);
                                    throw ode;
                                } catch (InvocationTargetException e) {
                                    break;
                                }
                            }
                        }
                        throw new EOFException("if your code relies on this, think");
                    }
                    return FSTObjectInput.this.readObjectInternal(referencee.getPossibleClasses());
                } catch (IllegalAccessException e) {
                    throw new IOException(e);
                } catch (InstantiationException e) {
                    throw new IOException(e);
                }
            }

            @Override
            public Object readUnshared() throws IOException, ClassNotFoundException {
                try {
                    return FSTObjectInput.this.readObjectInternal(referencee.getPossibleClasses()); // fixme
                } catch (IllegalAccessException e) {
                    throw new IOException(e);
                } catch (InstantiationException e) {
                    throw new IOException(e);
                }
            }

            @Override
            public void defaultReadObject() throws IOException, ClassNotFoundException {
                try {
                    int tag = readByte();
                    if ( tag == 77 ) // came from writeFields
                    {
                        fieldMap = (HashMap<String, Object>) FSTObjectInput.this.readObjectInternal(HashMap.class);
                        // object has been written with writeFields, is no read with defaultReadObjects,
                        // need to autoapply map to object vars.
                        // this might be redundant in case readObject() pulls a getFields() .. (see bitset testcase)
                        for (Iterator<String> iterator = fieldMap.keySet().iterator(); iterator.hasNext(); ) {
                            String key = iterator.next();
                            FSTClazzInfo.FSTFieldInfo fieldInfo = clInfo.getFieldInfo(key, null);// in case fieldName is not unique => cannot recover/fix
                            if ( fieldInfo != null ) {
                                fieldInfo.setObjectValue(toRead,fieldMap.get(key));
                            }
                        }
                    } else {
                        FSTObjectInput.this.readObjectFields(
                                referencee,
                                clInfo,
                                clInfo.getCompInfo().get(cl).getFieldArray(),
                                toRead,
                                0,
                                0
                        ); // FIXME: only fields of current class
                    }
                } catch (Exception e) {
                    throw new IOException(e);
                }
            }

            HashMap<String, Object> fieldMap;

            @Override
            public GetField readFields() throws IOException, ClassNotFoundException {
                int tag = readByte();
                try {
                    FSTClazzInfo.FSTCompatibilityInfo fstCompatibilityInfo = clInfo.getCompInfo().get(cl);
                    if (tag==99) { // came from defaultwriteobject
                        // Note: in case number and names of instance fields of reader/writer are different,
                        // this fails as code below implicitely assumes, fields of writer == fields of reader
                        // unfortunately one can use defaultWriteObject at writer side but use getFields at reader side
                        // in readObject(). if then fields differ, code below reads BS and fails.
                        // Its impossible to fix that except by always using putField + getField for
                        // JDK compatibility classes, however this will waste lots of performance. As
                        // it would be necessary to *always* write full metainformation (a map of fieldName => value pairs)
                        // see #53
                        fieldMap = new HashMap<String, Object>();
                        FSTObjectInput.this.readCompatibleObjectFields(referencee, clInfo, fstCompatibilityInfo.getFieldArray(), fieldMap);
                        getCodec().readVersionTag(); // consume dummy version tag as created by defaultWriteObject
                    } else if (tag == 66) { // has been written from writeObjectCompatible without writeMethod
                        fieldMap = new HashMap<String, Object>();
                        FSTObjectInput.this.readCompatibleObjectFields(referencee, clInfo, fstCompatibilityInfo.getFieldArray(), fieldMap);
                        getCodec().readVersionTag(); // consume dummy version tag as created by defaultWriteObject
                    } else {
                        fieldMap = (HashMap<String, Object>) FSTObjectInput.this.readObjectInternal(HashMap.class);
                    }
                } catch (Exception e) {
                    FSTUtil.<RuntimeException>rethrow(e);
                }
                return new GetField() {
                    @Override
                    public ObjectStreamClass getObjectStreamClass() {
                        return ObjectStreamClass.lookup(cl);
                    }

                    @Override
                    public boolean defaulted(String name) throws IOException {
                        return fieldMap.get(name) == null;
                    }

                    @Override
                    public boolean get(String name, boolean val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Boolean) fieldMap.get(name)).booleanValue();
                    }

                    @Override
                    public byte get(String name, byte val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Byte) fieldMap.get(name)).byteValue();
                    }

                    @Override
                    public char get(String name, char val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Character) fieldMap.get(name)).charValue();
                    }

                    @Override
                    public short get(String name, short val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Short) fieldMap.get(name)).shortValue();
                    }

                    @Override
                    public int get(String name, int val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Integer) fieldMap.get(name)).intValue();
                    }

                    @Override
                    public long get(String name, long val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Long) fieldMap.get(name)).longValue();
                    }

                    @Override
                    public float get(String name, float val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Float) fieldMap.get(name)).floatValue();
                    }

                    @Override
                    public double get(String name, double val) throws IOException {
                        if (fieldMap.get(name) == null) {
                            return val;
                        }
                        return ((Double) fieldMap.get(name)).doubleValue();
                    }

                    @Override
                    public Object get(String name, Object val) throws IOException {
                        Object res = fieldMap.get(name);
                        if (res == null) {
                            return val;
                        }
                        return res;
                    }
                };
            }

            @Override
            public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectException {
                if (callbacks == null) {
                    callbacks = new ArrayList<CallbackEntry>();
                }
                callbacks.add(new CallbackEntry(obj, prio));
            }

            @Override
            public int read() throws IOException {
                return getCodec().readFByte();
            }

            @Override
            public int read(byte[] buf, int off, int len) throws IOException {
                return FSTObjectInput.this.read(buf, off, len);
            }

            @Override
            public int available() throws IOException {
                return FSTObjectInput.this.available();
            }

            @Override
            public void close() throws IOException {
            }

            @Override
            public boolean readBoolean() throws IOException {
                return FSTObjectInput.this.readBoolean();
            }

            @Override
            public byte readByte() throws IOException {
                return getCodec().readFByte();
            }

            @Override
            public int readUnsignedByte() throws IOException {
                return FSTObjectInput.this.readUnsignedByte();
            }

            @Override
            public char readChar() throws IOException {
                return getCodec().readFChar();
            }

            @Override
            public short readShort() throws IOException {
                return getCodec().readFShort();
            }

            @Override
            public int readUnsignedShort() throws IOException {
                return FSTObjectInput.this.readUnsignedShort();
            }

            @Override
            public int readInt() throws IOException {
                return getCodec().readFInt();
            }

            @Override
            public long readLong() throws IOException {
                return getCodec().readFLong();
            }

            @Override
            public float readFloat() throws IOException {
                return getCodec().readFFloat();
            }

            @Override
            public double readDouble() throws IOException {
                return getCodec().readFDouble();
            }

            @Override
            public void readFully(byte[] buf) throws IOException {
                FSTObjectInput.this.readFully(buf);
            }

            @Override
            public void readFully(byte[] buf, int off, int len) throws IOException {
                FSTObjectInput.this.readFully(buf, off, len);
            }

            @Override
            public int skipBytes(int len) throws IOException {
                return FSTObjectInput.this.skipBytes(len);
            }

            @Override
            public String readUTF() throws IOException {
                return getCodec().readStringUTF();
            }

            @Override
            public String readLine() throws IOException {
                return FSTObjectInput.this.readLine();
            }

            @Override
            public int read(byte[] b) throws IOException {
                return FSTObjectInput.this.read(b);
            }

            @Override
            public long skip(long n) throws IOException {
                return FSTObjectInput.this.skip(n);
            }

            @Override
            public void mark(int readlimit) {
                throw new RuntimeException("not implemented");
            }

            @Override
            public void reset() throws IOException {
                FSTObjectInput.this.reset();
            }

            @Override
            public boolean markSupported() {
                return false;
            }
        };
        if ( fakeWrapper == null ) {
            fakeWrapper = new MyObjectStream();
        }
        fakeWrapper.push(wrapped);
        return fakeWrapper;
    }
protected ObjectInputStream getObjectInputStream ( final Class cl , final FSTClazzInfo clInfo , final FSTClazzInfo . FSTFieldInfo referencee , final Object toRead ) throws IOException { ObjectInputStream wrapped = new ObjectInputStream ( ) { @ Override public Object readObjectOverride ( ) throws IOException , ClassNotFoundException { try { byte b = FSTObjectInput . this . readByte ( ) ; if ( b != FSTObjectOutput . SPECIAL_COMPATIBILITY_OBJECT_TAG ) { Constructor < ? > [ ] constructors = OptionalDataException . class . getDeclaredConstructors ( ) ; FSTObjectInput . this . pushBack ( 1 ) ; for ( int i = 0 ; i < constructors . length ; i ++ ) { Constructor constructor = constructors [ i ] ; Class [ ] typeParameters = constructor . getParameterTypes ( ) ; if ( typeParameters != null && typeParameters . length == 1 && typeParameters [ 0 ] == int . class ) { constructor . setAccessible ( true ) ; OptionalDataException ode ; try { ode = ( OptionalDataException ) constructor . newInstance ( 0 ) ; throw ode ; } catch ( InvocationTargetException e ) { break ; } } } throw new EOFException ( "if your code relies on this, think" ) ; } return FSTObjectInput . this . readObjectInternal ( referencee . getPossibleClasses ( ) ) ; } catch ( IllegalAccessException e ) { throw new IOException ( e ) ; } catch ( InstantiationException e ) { throw new IOException ( e ) ; } } @ Override public Object readUnshared ( ) throws IOException , ClassNotFoundException { try { return FSTObjectInput . this . readObjectInternal ( referencee . getPossibleClasses ( ) ) ; // fixme } catch ( IllegalAccessException e ) { throw new IOException ( e ) ; } catch ( InstantiationException e ) { throw new IOException ( e ) ; } } @ Override public void defaultReadObject ( ) throws IOException , ClassNotFoundException { try { int tag = readByte ( ) ; if ( tag == 77 ) // came from writeFields { fieldMap = ( HashMap < String , Object > ) FSTObjectInput . this . readObjectInternal ( HashMap . class ) ; // object has been written with writeFields, is no read with defaultReadObjects, // need to autoapply map to object vars. // this might be redundant in case readObject() pulls a getFields() .. (see bitset testcase) for ( Iterator < String > iterator = fieldMap . keySet ( ) . iterator ( ) ; iterator . hasNext ( ) ; ) { String key = iterator . next ( ) ; FSTClazzInfo . FSTFieldInfo fieldInfo = clInfo . getFieldInfo ( key , null ) ; // in case fieldName is not unique => cannot recover/fix if ( fieldInfo != null ) { fieldInfo . setObjectValue ( toRead , fieldMap . get ( key ) ) ; } } } else { FSTObjectInput . this . readObjectFields ( referencee , clInfo , clInfo . getCompInfo ( ) . get ( cl ) . getFieldArray ( ) , toRead , 0 , 0 ) ; // FIXME: only fields of current class } } catch ( Exception e ) { throw new IOException ( e ) ; } } HashMap < String , Object > fieldMap ; @ Override public GetField readFields ( ) throws IOException , ClassNotFoundException { int tag = readByte ( ) ; try { FSTClazzInfo . FSTCompatibilityInfo fstCompatibilityInfo = clInfo . getCompInfo ( ) . get ( cl ) ; if ( tag == 99 ) { // came from defaultwriteobject // Note: in case number and names of instance fields of reader/writer are different, // this fails as code below implicitely assumes, fields of writer == fields of reader // unfortunately one can use defaultWriteObject at writer side but use getFields at reader side // in readObject(). if then fields differ, code below reads BS and fails. // Its impossible to fix that except by always using putField + getField for // JDK compatibility classes, however this will waste lots of performance. As // it would be necessary to *always* write full metainformation (a map of fieldName => value pairs) // see #53 fieldMap = new HashMap < String , Object > ( ) ; FSTObjectInput . this . readCompatibleObjectFields ( referencee , clInfo , fstCompatibilityInfo . getFieldArray ( ) , fieldMap ) ; getCodec ( ) . readVersionTag ( ) ; // consume dummy version tag as created by defaultWriteObject } else if ( tag == 66 ) { // has been written from writeObjectCompatible without writeMethod fieldMap = new HashMap < String , Object > ( ) ; FSTObjectInput . this . readCompatibleObjectFields ( referencee , clInfo , fstCompatibilityInfo . getFieldArray ( ) , fieldMap ) ; getCodec ( ) . readVersionTag ( ) ; // consume dummy version tag as created by defaultWriteObject } else { fieldMap = ( HashMap < String , Object > ) FSTObjectInput . this . readObjectInternal ( HashMap . class ) ; } } catch ( Exception e ) { FSTUtil . < RuntimeException > rethrow ( e ) ; } return new GetField ( ) { @ Override public ObjectStreamClass getObjectStreamClass ( ) { return ObjectStreamClass . lookup ( cl ) ; } @ Override public boolean defaulted ( String name ) throws IOException { return fieldMap . get ( name ) == null ; } @ Override public boolean get ( String name , boolean val ) throws IOException { if ( fieldMap . get ( name ) == null ) { return val ; } return ( ( Boolean ) fieldMap . get ( name ) ) . booleanValue ( ) ; } @ Override public byte get ( String name , byte val ) throws IOException { if ( fieldMap . get ( name ) == null ) { return val ; } return ( ( Byte ) fieldMap . get ( name ) ) . byteValue ( ) ; } @ Override public char get ( String name , char val ) throws IOException { if ( fieldMap . get ( name ) == null ) { return val ; } return ( ( Character ) fieldMap . get ( name ) ) . charValue ( ) ; } @ Override public short get ( String name , short val ) throws IOException { if ( fieldMap . get ( name ) == null ) { return val ; } return ( ( Short ) fieldMap . get ( name ) ) . shortValue ( ) ; } @ Override public int get ( String name , int val ) throws IOException { if ( fieldMap . get ( name ) == null ) { return val ; } return ( ( Integer ) fieldMap . get ( name ) ) . intValue ( ) ; } @ Override public long get ( String name , long val ) throws IOException { if ( fieldMap . get ( name ) == null ) { return val ; } return ( ( Long ) fieldMap . get ( name ) ) . longValue ( ) ; } @ Override public float get ( String name , float val ) throws IOException { if ( fieldMap . get ( name ) == null ) { return val ; } return ( ( Float ) fieldMap . get ( name ) ) . floatValue ( ) ; } @ Override public double get ( String name , double val ) throws IOException { if ( fieldMap . get ( name ) == null ) { return val ; } return ( ( Double ) fieldMap . get ( name ) ) . doubleValue ( ) ; } @ Override public Object get ( String name , Object val ) throws IOException { Object res = fieldMap . get ( name ) ; if ( res == null ) { return val ; } return res ; } } ; } @ Override public void registerValidation ( ObjectInputValidation obj , int prio ) throws NotActiveException , InvalidObjectException { if ( callbacks == null ) { callbacks = new ArrayList < CallbackEntry > ( ) ; } callbacks . add ( new CallbackEntry ( obj , prio ) ) ; } @ Override public int read ( ) throws IOException { return getCodec ( ) . readFByte ( ) ; } @ Override public int read ( byte [ ] buf , int off , int len ) throws IOException { return FSTObjectInput . this . read ( buf , off , len ) ; } @ Override public int available ( ) throws IOException { return FSTObjectInput . this . available ( ) ; } @ Override public void close ( ) throws IOException { } @ Override public boolean readBoolean ( ) throws IOException { return FSTObjectInput . this . readBoolean ( ) ; } @ Override public byte readByte ( ) throws IOException { return getCodec ( ) . readFByte ( ) ; } @ Override public int readUnsignedByte ( ) throws IOException { return FSTObjectInput . this . readUnsignedByte ( ) ; } @ Override public char readChar ( ) throws IOException { return getCodec ( ) . readFChar ( ) ; } @ Override public short readShort ( ) throws IOException { return getCodec ( ) . readFShort ( ) ; } @ Override public int readUnsignedShort ( ) throws IOException { return FSTObjectInput . this . readUnsignedShort ( ) ; } @ Override public int readInt ( ) throws IOException { return getCodec ( ) . readFInt ( ) ; } @ Override public long readLong ( ) throws IOException { return getCodec ( ) . readFLong ( ) ; } @ Override public float readFloat ( ) throws IOException { return getCodec ( ) . readFFloat ( ) ; } @ Override public double readDouble ( ) throws IOException { return getCodec ( ) . readFDouble ( ) ; } @ Override public void readFully ( byte [ ] buf ) throws IOException { FSTObjectInput . this . readFully ( buf ) ; } @ Override public void readFully ( byte [ ] buf , int off , int len ) throws IOException { FSTObjectInput . this . readFully ( buf , off , len ) ; } @ Override public int skipBytes ( int len ) throws IOException { return FSTObjectInput . this . skipBytes ( len ) ; } @ Override public String readUTF ( ) throws IOException { return getCodec ( ) . readStringUTF ( ) ; } @ Override public String readLine ( ) throws IOException { return FSTObjectInput . this . readLine ( ) ; } @ Override public int read ( byte [ ] b ) throws IOException { return FSTObjectInput . this . read ( b ) ; } @ Override public long skip ( long n ) throws IOException { return FSTObjectInput . this . skip ( n ) ; } @ Override public void mark ( int readlimit ) { throw new RuntimeException ( "not implemented" ) ; } @ Override public void reset ( ) throws IOException { FSTObjectInput . this . reset ( ) ; } @ Override public boolean markSupported ( ) { return false ; } } ; if ( fakeWrapper == null ) { fakeWrapper = new MyObjectStream ( ) ; } fakeWrapper . push ( wrapped ) ; return fakeWrapper ; }
some jdk classes hash for ObjectStream, so provide the same instance always
some jdk classes hash for ObjectStream so provide the same instance always