⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iiopoutputstream.java

📁 java jdk 1.4的源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        }        catch(Error e)	    {		throw new IOException(e.getMessage());	    }    }    protected final void writeStreamHeader() throws IOException{        // no op    }    /**     * Helper method for correcting the Kestrel bug 4367783 (dealing     * with larger than 8-bit chars).  The old behavior is preserved     * in orbutil.IIOPInputStream_1_3 in order to interoperate with     * our legacy ORBs.     */    protected void internalWriteUTF(org.omg.CORBA.portable.OutputStream stream,                                    String data)     {        stream.write_wstring(data);    }    public final void writeUTF(String data) throws IOException{        try{            internalWriteUTF(orbStream, data);        }        catch(Error e)	    {		throw new IOException(e.getMessage());	    }    }    // INTERNAL UTILITY METHODS    /*     * Check for special cases of serializing objects.     * These objects are not subject to replacement.     */    private boolean checkSpecialClasses(Object obj) throws IOException {    	/*    	 * If this is a class, don't allow substitution    	 */    	//if (obj instanceof Class) {        //    throw new IOException("Serialization of Class not supported");    	//}    	if (obj instanceof ObjectStreamClass) {            throw new IOException("Serialization of ObjectStreamClass not supported");    	}    	return false;    }    /*     * Check for special cases of substitutable serializing objects.     * These classes are replaceable.     */    private boolean checkSubstitutableSpecialClasses(Object obj)	throws IOException    {    	if (obj instanceof String) {    	    orbStream.write_value((java.io.Serializable)obj);    	    return true;    	}    	//if (obj.getClass().isArray()) {    	//    outputArray(obj);    	//    return true;    	//}    	return false;    }    /*     * Write out the object     */    private void outputObject(Object obj) throws IOException{    	currentObject = obj;    	Class currclass = obj.getClass();    	/* Get the Class descriptor for this class,    	 * Throw a NotSerializableException if there is none.    	 */    	currentClassDesc = ObjectStreamClass.lookup(currclass);    	if (currentClassDesc == null) {    	    throw new NotSerializableException(currclass.getName());    	}    	/* If the object is externalizable,    	 * call writeExternal.    	 * else do Serializable processing.    	 */    	if (currentClassDesc.isExternalizable()) {	    // Write format version	    writeByte(kFormatVersionOne);    	    Externalizable ext = (Externalizable)obj;    	    ext.writeExternal(this);    	} else {    	    /* The object's classes should be processed from supertype to subtype    	     * Push all the clases of the current object onto a stack.    	     * Remember the stack pointer where this set of classes is being pushed.    	     */    	    int stackMark = classDescStack.size();    	    try {    		ObjectStreamClass next;    		while ((next = currentClassDesc.getSuperclass()) != null) {    		    classDescStack.push(currentClassDesc);    		    currentClassDesc = next;    		}    		/*    		 * For currentClassDesc and all the pushed class descriptors    		 *    If the class is writing its own data    		 *		  set blockData = true; call the class writeObject method    		 *    If not    		 *     invoke either the defaultWriteObject method.    		 */    		do {    		    if (currentClassDesc.hasWriteObject()) {			invokeObjectWriter(obj, currentClassDesc.forClass());    		    } else {			defaultWriteObjectDelegate();    		    }    		} while (classDescStack.size() > stackMark &&    			 (currentClassDesc = (ObjectStreamClass)classDescStack.pop()) != null);    	    } finally {		classDescStack.setSize(stackMark);    	    }    	}    }    /*     * Invoke writer.     * _REVISIT_ invokeObjectWriter and invokeObjectReader behave inconsistently with each other since     * the reader returns a boolean...fix later     */    private void invokeObjectWriter(Object obj, Class c)	throws IOException    {    	try {				    // Write format version	    writeByte(kFormatVersionOne);	    // Write defaultWriteObject indicator	    // - We write this as false, but may have to go back and undo this if it is later called            // Changed to true since this is what will happen in most cases.  We still need            // to go back and fix this at some point.	    writeBoolean(true);	    writeObject(obj, c, this);    	} catch (InvocationTargetException e) {    	    Throwable t = e.getTargetException();    	    if (t instanceof IOException)    		throw (IOException)t;    	    else if (t instanceof RuntimeException)    		throw (RuntimeException) t;    	    else if (t instanceof Error)    		throw (Error) t;    	    else    		throw new Error("invokeObjectWriter interal error");    	} catch (IllegalAccessException e) {    	    // cannot happen    	} finally {    	}    }    void writeField(ObjectStreamField field, Object value) throws IOException {        switch (field.getTypeCode()) {            case 'B':                if (value == null)                    orbStream.write_octet((byte)0);                else                    orbStream.write_octet(((Byte)value).byteValue());		break;	    case 'C':                if (value == null)                    orbStream.write_wchar((char)0);                else                    orbStream.write_wchar(((Character)value).charValue());		break;	    case 'F':                if (value == null)                    orbStream.write_float((float)0);                else                    orbStream.write_float(((Float)value).floatValue());		break;            case 'D':                if (value == null)                    orbStream.write_double((double)0);                else                    orbStream.write_double(((Double)value).doubleValue());		break;	    case 'I':                if (value == null)                    orbStream.write_long((int)0);                else                    orbStream.write_long(((Integer)value).intValue());		break;	    case 'J':                if (value == null)                    orbStream.write_longlong((long)0);                else                    orbStream.write_longlong(((Long)value).longValue());		break;	    case 'S':                if (value == null)                    orbStream.write_short((short)0);                else                    orbStream.write_short(((Short)value).shortValue());		break;	    case 'Z':                if (value == null)                    orbStream.write_boolean(false);                else                    orbStream.write_boolean(((Boolean)value).booleanValue());		break;	    case '[':	    case 'L':                // What to do if it's null?                writeObjectField(field, value);		break;	    default:		throw new InvalidClassException(currentClassDesc.getName());	    }    }    private void writeObjectField(ObjectStreamField field,                                  Object objectValue) throws IOException {        if (ObjectStreamClassCorbaExt.isAny(field.getTypeString())) {            javax.rmi.CORBA.Util.writeAny(orbStream, objectValue);        }        else {            Class type = field.getType();            int callType = ValueHandlerImpl.kValueType;					            if (type.isInterface()) {                 String className = type.getName();                                if (java.rmi.Remote.class.isAssignableFrom(type)) {                                        // RMI Object reference...                                        callType = ValueHandlerImpl.kRemoteType;                                                        } else if (org.omg.CORBA.Object.class.isAssignableFrom(type)){                                        // IDL Object reference...                    callType = ValueHandlerImpl.kRemoteType;                                    } else if (RepositoryId.isAbstractBase(type)) {                    // IDL Abstract Object reference...                    callType = ValueHandlerImpl.kAbstractType;                } else if (ObjectStreamClassCorbaExt.isAbstractInterface(type)) {                    callType = ValueHandlerImpl.kAbstractType;                }            }					            switch (callType) {            case ValueHandlerImpl.kRemoteType:                 Util.writeRemoteObject(orbStream, objectValue);                break;            case ValueHandlerImpl.kAbstractType:                 Util.writeAbstractObject(orbStream, objectValue);                break;            case ValueHandlerImpl.kValueType:                try{                    orbStream.write_value((java.io.Serializable)objectValue, type);                }                catch(ClassCastException cce){                    if (objectValue instanceof java.io.Serializable)                        throw cce;                    else                        Utility.throwNotSerializableForCorba(objectValue.getClass().getName());                }            }        }    }    /* Write the fields of the specified class by invoking the appropriate     * write* method on this class.     */    private void outputClassFields(Object o, Class cl,				   ObjectStreamField[] fields)	throws IOException, InvalidClassException {    	for (int i = 0; i < fields.length; i++) {    	    if (fields[i].getField() == null)    		throw new InvalidClassException(cl.getName(),						"Nonexistent field " + fields[i].getName());	    switch (fields[i].getTypeCode()) {	    case 'B':		byte byteValue = getByteFieldOpt(o, fields[i].getFieldID(cl));		orbStream.write_octet(byteValue);		break;	    case 'C':		char charValue = getCharFieldOpt(o, fields[i].getFieldID(cl));		orbStream.write_wchar(charValue);		break;	    case 'F':		float floatValue = getFloatFieldOpt(o, fields[i].getFieldID(cl));		orbStream.write_float(floatValue);		break;	    case 'D' :		double doubleValue = getDoubleFieldOpt(o, fields[i].getFieldID(cl));		orbStream.write_double(doubleValue);		break;	    case 'I':		int intValue = getIntFieldOpt(o, fields[i].getFieldID(cl));		orbStream.write_long(intValue);		break;	    case 'J':		long longValue = getLongFieldOpt(o, fields[i].getFieldID(cl));		orbStream.write_longlong(longValue);		break;	    case 'S':		short shortValue = getShortFieldOpt(o, fields[i].getFieldID(cl));		orbStream.write_short(shortValue);		break;	    case 'Z':		boolean booleanValue = getBooleanFieldOpt(o, fields[i].getFieldID(cl));		orbStream.write_boolean(booleanValue);		break;	    case '[':	    case 'L':		Object objectValue = getObjectFieldOpt(o, fields[i].getFieldID(cl));                writeObjectField(fields[i], objectValue);                break;	    default:		throw new InvalidClassException(cl.getName());	    }    	}    }    /* Create a pending exception.  This is needed to get around     * the fact that the *Delegate methods do not explicitly     * declare that they throw exceptions.       *     * This native method creates an exception of the given type with     * the given message string and posts it to the pending queue.     */    private static native void throwExceptionType(Class c, String message);    private static native Object getObjectFieldOpt(Object o, long fieldID);    private static native boolean getBooleanFieldOpt(Object o, long fieldID);    private static native byte getByteFieldOpt(Object o, long fieldID);    private static native char getCharFieldOpt(Object o, long fieldID);    private static native short getShortFieldOpt(Object o, long fieldID);    private static native int getIntFieldOpt(Object o, long fieldID);    private static native long getLongFieldOpt(Object o, long fieldID);    private static native float getFloatFieldOpt(Object o, long fieldID);    private static native double getDoubleFieldOpt(Object o, long fieldID);    private static native void writeObject(Object obj, Class asClass, Object oos)        throws InvocationTargetException, IllegalAccessException;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -