@Override public int available() throws IOException { return getCodec().available(); }
public Class getClassForName(String name) throws ClassNotFoundException { return getCodec().classForName(name); }
@Override public void close() throws IOException { closed = true; resetAndClearRefs(); conf.returnObject(objects); getCodec().close(); }
protected Object readArray(FSTClazzInfo.FSTFieldInfo referencee, int pos) throws Exception { Object classOrArray = getCodec().readArrayHeader(); if (pos < 0) pos = getCodec().getInputPos(); if ( classOrArray instanceof Class == false ) return classOrArray; if ( classOrArray == null ) return null; Object o = readArrayNoHeader(referencee, pos, (Class) classOrArray); getCodec().readArrayEnd(null); return o; }
protected Object instantiateHandle(FSTClazzInfo.FSTFieldInfo referencee) throws IOException { int handle = getCodec().readFInt(); Object res = objects.getReadRegisteredObject(handle); if (res == null) { throw new IOException("unable to ressolve handle " + handle + " " + referencee.getDesc() + " " + getCodec().getInputPos() ); } return res; }
protected Object instantiateAndReadNoSer(Class c, FSTClazzInfo clzSerInfo, FSTClazzInfo.FSTFieldInfo referencee, int readPos) throws Exception { Object newObj; newObj = clzSerInfo.newInstance(getCodec().isMapBased()); if (newObj == null) { throw new IOException(referencee.getDesc() + ":Failed to instantiate '" + c.getName() + "'. Register a custom serializer implementing instantiate or define empty constructor.."); } if ( clzSerInfo.isExternalizable() ) { getCodec().ensureReadAhead(readExternalReadAHead); ((Externalizable)newObj).readExternal(this); getCodec().readExternalEnd(); } else { FSTClazzInfo.FSTFieldInfo[] fieldInfo = clzSerInfo.getFieldInfo(); readObjectFields(referencee, clzSerInfo, fieldInfo, newObj,0,0); } return newObj; }
protected void readFieldsMapBased(FSTClazzInfo.FSTFieldInfo referencee, FSTClazzInfo serializationInfo, Object newObj) throws Exception { String name; int len = getCodec().getObjectHeaderLen(); // check if len is known in advance if ( len < 0 ) len = Integer.MAX_VALUE; int count = 0; boolean isUnknown = newObj.getClass() == Unknown.class; // json boolean inArray = isUnknown && getCodec().inArray(); // json externalized/custom serialized getCodec().startFieldReading(newObj); if ( o != null && getCodec().isEndMarker(o.toString()) ) return; ((Unknown)newObj).add(o); continue; name= getCodec().readStringUTF(); if ( len == Integer.MAX_VALUE && getCodec().isEndMarker(name) ) return; count++; fieldInfo.setBooleanValue(newObj, getCodec().readFByte() == 0 ? false : true); break; case FSTClazzInfo.FSTFieldInfo.BYTE: fieldInfo.setByteValue(newObj, getCodec().readFByte()); break; case FSTClazzInfo.FSTFieldInfo.CHAR: fieldInfo.setCharValue(newObj, getCodec().readFChar()); break; case FSTClazzInfo.FSTFieldInfo.SHORT:
protected Object instantiateSpecialTag(FSTClazzInfo.FSTFieldInfo referencee, int readPos, byte code) throws Exception { if ( code == FSTObjectOutput.STRING ) { // faster than switch, note: currently string tag not used by all codecs .. String res = getCodec().readStringUTF(); objects.registerObjectForRead(res, readPos); return res; case FSTObjectOutput.BIG_LONG: { return Long.valueOf(getCodec().readFLong()); } case FSTObjectOutput.BIG_BOOLEAN_FALSE: { return Boolean.FALSE; } case FSTObjectOutput.BIG_BOOLEAN_TRUE: { return Boolean.TRUE; } case FSTObjectOutput.ONE_OF: { return referencee.getOneOf()[getCodec().readFByte()]; } Object directObject = getCodec().getDirectObject(); objects.registerObjectForRead(directObject,readPos); return directObject; Object directObject = getCodec().getDirectObject(); if (directObject.getClass() == byte[].class) { // fixme. special for minibin, move it there if ( referencee != null && referencee.getType() == boolean[].class ) getCodec().readObjectEnd(); return res;
protected Object readArrayNoHeader(FSTClazzInfo.FSTFieldInfo referencee, int pos, Class arrCl) throws Exception { final int len = getCodec().readFInt(); if (len == -1) { return null; objects.registerObjectForRead(array, pos ); if (arrType.isPrimitive()) { return getCodec().readFPrimitiveArray(array, arrType, len); } else { // Object Array Object arr[] = (Object[]) array; for (int i = 0; i < len; i++) { Object value = readObjectWithHeader(referencee); value = getCodec().coerceElement(arrType, value); arr[i] = value; getCodec().readObjectEnd();
public Object readObjectWithHeader(FSTClazzInfo.FSTFieldInfo referencee) throws Exception { FSTClazzInfo clzSerInfo; Class c; final int readPos = getCodec().getInputPos(); byte code = getCodec().readObjectHeaderTag(); // NOTICE: THIS ADVANCES THE INPUT STREAM... if (code == FSTObjectOutput.OBJECT ) { if (ser != null) { Object res = instantiateAndReadWithSer(c, ser, clzSerInfo, referencee, readPos); getCodec().readArrayEnd(clzSerInfo); return res; } else {
protected Object instantiateAndReadWithSer(Class c, FSTObjectSerializer ser, FSTClazzInfo clzSerInfo, FSTClazzInfo.FSTFieldInfo referencee, int readPos) throws Exception { boolean serInstance = false; Object newObj = ser.instantiate(c, this, clzSerInfo, referencee, readPos); if (newObj == null) { newObj = clzSerInfo.newInstance(getCodec().isMapBased()); } else serInstance = true; if (newObj == null) { throw new IOException(referencee.getDesc() + ":Failed to instantiate '" + c.getName() + "'. Register a custom serializer implementing instantiate or define empty constructor.."); } if ( newObj == FSTObjectSerializer.REALLY_NULL ) { newObj = null; } else { if (newObj.getClass() != c && ser == null ) { // for advanced trickery (e.g. returning non-serializable from FSTSerializer) // this hurts. so in case of FSTSerializers incoming clzInfo will refer to the // original class, not the one actually instantiated c = newObj.getClass(); clzSerInfo = clInfoRegistry.getCLInfo(c, conf); } if ( ! referencee.isFlat() && ! clzSerInfo.isFlat() && !ser.alwaysCopy()) { objects.registerObjectForRead(newObj, readPos); } if ( !serInstance ) ser.readObject(this, newObj, clzSerInfo, referencee); } getCodec().consumeEndMarker(); //=> bug when writing objects unlimited return newObj; }
getCodec().moveTo(getCodec().getInputPos() - 1); // need to push back tag, cause defaultWriteObject on writer side does not write tag
protected void readFieldsMapBased(FSTClazzInfo.FSTFieldInfo referencee, FSTClazzInfo serializationInfo, Object newObj) throws Exception { String name; int len = getCodec().getObjectHeaderLen(); // check if len is known in advance if ( len < 0 ) len = Integer.MAX_VALUE; int count = 0; boolean isUnknown = newObj.getClass() == Unknown.class; // json boolean inArray = isUnknown && getCodec().inArray(); // json externalized/custom serialized getCodec().startFieldReading(newObj); if ( o != null && getCodec().isEndMarker(o.toString()) ) return; ((Unknown)newObj).add(o); continue; name= getCodec().readStringUTF(); if ( len == Integer.MAX_VALUE && getCodec().isEndMarker(name) ) return; count++; fieldInfo.setBooleanValue(newObj, getCodec().readFByte() == 0 ? false : true); break; case FSTClazzInfo.FSTFieldInfo.BYTE: fieldInfo.setByteValue(newObj, getCodec().readFByte()); break; case FSTClazzInfo.FSTFieldInfo.CHAR: fieldInfo.setCharValue(newObj, getCodec().readFChar()); break; case FSTClazzInfo.FSTFieldInfo.SHORT:
protected Object instantiateSpecialTag(FSTClazzInfo.FSTFieldInfo referencee, int readPos, byte code) throws Exception { if ( code == FSTObjectOutput.STRING ) { // faster than switch, note: currently string tag not used by all codecs .. String res = getCodec().readStringUTF(); objects.registerObjectForRead(res, readPos); return res; case FSTObjectOutput.BIG_LONG: { return Long.valueOf(getCodec().readFLong()); } case FSTObjectOutput.BIG_BOOLEAN_FALSE: { return Boolean.FALSE; } case FSTObjectOutput.BIG_BOOLEAN_TRUE: { return Boolean.TRUE; } case FSTObjectOutput.ONE_OF: { return referencee.getOneOf()[getCodec().readFByte()]; } Object directObject = getCodec().getDirectObject(); objects.registerObjectForRead(directObject,readPos); return directObject; Object directObject = getCodec().getDirectObject(); if (directObject.getClass() == byte[].class) { // fixme. special for minibin, move it there if ( referencee != null && referencee.getType() == boolean[].class ) getCodec().readObjectEnd(); return res;
protected Object instantiateAndReadNoSer(Class c, FSTClazzInfo clzSerInfo, FSTClazzInfo.FSTFieldInfo referencee, int readPos) throws Exception { Object newObj; newObj = clzSerInfo.newInstance(getCodec().isMapBased()); if (newObj == null) { throw new IOException(referencee.getDesc() + ":Failed to instantiate '" + c.getName() + "'. Register a custom serializer implementing instantiate or define empty constructor.."); } if ( clzSerInfo.isExternalizable() ) { getCodec().ensureReadAhead(readExternalReadAHead); ((Externalizable)newObj).readExternal(this); getCodec().readExternalEnd(); } else { FSTClazzInfo.FSTFieldInfo[] fieldInfo = clzSerInfo.getFieldInfo(); readObjectFields(referencee, clzSerInfo, fieldInfo, newObj,0,0); } return newObj; }
protected Object readArrayNoHeader(FSTClazzInfo.FSTFieldInfo referencee, int pos, Class arrCl) throws Exception { final int len = getCodec().readFInt(); if (len == -1) { return null; objects.registerObjectForRead(array, pos ); if (arrType.isPrimitive()) { return getCodec().readFPrimitiveArray(array, arrType, len); } else { // Object Array Object arr[] = (Object[]) array; for (int i = 0; i < len; i++) { Object value = readObjectWithHeader(referencee); value = getCodec().coerceElement(arrType, value); arr[i] = value; getCodec().readObjectEnd();
protected Object readArray(FSTClazzInfo.FSTFieldInfo referencee, int pos) throws Exception { Object classOrArray = getCodec().readArrayHeader(); if (pos < 0) pos = getCodec().getInputPos(); if ( classOrArray instanceof Class == false ) return classOrArray; if ( classOrArray == null ) return null; Object o = readArrayNoHeader(referencee, pos, (Class) classOrArray); getCodec().readArrayEnd(null); return o; }
public Object readObjectWithHeader(FSTClazzInfo.FSTFieldInfo referencee) throws Exception { FSTClazzInfo clzSerInfo; Class c; final int readPos = getCodec().getInputPos(); byte code = getCodec().readObjectHeaderTag(); // NOTICE: THIS ADVANCES THE INPUT STREAM... if (code == FSTObjectOutput.OBJECT ) { if (ser != null) { Object res = instantiateAndReadWithSer(c, ser, clzSerInfo, referencee, readPos); getCodec().readArrayEnd(clzSerInfo); return res; } else {
protected Object instantiateHandle(FSTClazzInfo.FSTFieldInfo referencee) throws IOException { int handle = getCodec().readFInt(); Object res = objects.getReadRegisteredObject(handle); if (res == null) { throw new IOException("unable to ressolve handle " + handle + " " + referencee.getDesc() + " " + getCodec().getInputPos() ); } return res; }
protected Object instantiateAndReadWithSer(Class c, FSTObjectSerializer ser, FSTClazzInfo clzSerInfo, FSTClazzInfo.FSTFieldInfo referencee, int readPos) throws Exception { boolean serInstance = false; Object newObj = ser.instantiate(c, this, clzSerInfo, referencee, readPos); if (newObj == null) { newObj = clzSerInfo.newInstance(getCodec().isMapBased()); } else serInstance = true; if (newObj == null) { throw new IOException(referencee.getDesc() + ":Failed to instantiate '" + c.getName() + "'. Register a custom serializer implementing instantiate or define empty constructor.."); } if ( newObj == FSTObjectSerializer.REALLY_NULL ) { newObj = null; } else { if (newObj.getClass() != c && ser == null ) { // for advanced trickery (e.g. returning non-serializable from FSTSerializer) // this hurts. so in case of FSTSerializers incoming clzInfo will refer to the // original class, not the one actually instantiated c = newObj.getClass(); clzSerInfo = clInfoRegistry.getCLInfo(c, conf); } if ( ! referencee.isFlat() && ! clzSerInfo.isFlat() && !ser.alwaysCopy()) { objects.registerObjectForRead(newObj, readPos); } if ( !serInstance ) ser.readObject(this, newObj, clzSerInfo, referencee); } getCodec().consumeEndMarker(); //=> bug when writing objects unlimited return newObj; }