📄 iiopoutputstream.java
字号:
throw ioexc ; } } public final void writeInt(int data) throws IOException{ try{ writeObjectState.writeData(this); orbStream.write_long(data); } catch(Error e) { IOException ioexc = new IOException(e.getMessage()); ioexc.initCause(e) ; throw ioexc ; } } public final void writeLong(long data) throws IOException{ try{ writeObjectState.writeData(this); orbStream.write_longlong(data); } catch(Error e) { IOException ioexc = new IOException(e.getMessage()); ioexc.initCause(e) ; throw ioexc ; } } public final void writeShort(int data) throws IOException{ try{ writeObjectState.writeData(this); orbStream.write_short((short)data); } catch(Error e) { IOException ioexc = new IOException(e.getMessage()); ioexc.initCause(e) ; throw ioexc ; } } 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{ writeObjectState.writeData(this); internalWriteUTF(orbStream, data); } catch(Error e) { IOException ioexc = new IOException(e.getMessage()); ioexc.initCause(e) ; throw ioexc ; } } // 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) { // XXX I18N, Logging needed. 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(final 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) { // XXX I18N, Logging needed. throw new NotSerializableException(currclass.getName()); } /* If the object is externalizable, * call writeExternal. * else do Serializable processing. */ if (currentClassDesc.isExternalizable()) { // Write format version orbStream.write_octet(streamFormatVersion); 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 { WriteObjectState oldState = writeObjectState; try { setState(NOT_IN_WRITE_OBJECT); if (currentClassDesc.hasWriteObject()) { invokeObjectWriter(currentClassDesc, obj ); } else { defaultWriteObjectDelegate(); } } finally { setState(oldState); } } 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(ObjectStreamClass osc, Object obj) throws IOException { Class c = osc.forClass() ; try { // Write format version orbStream.write_octet(streamFormatVersion); writeObjectState.enterWriteObject(this); // writeObject(obj, c, this); osc.writeObjectMethod.invoke( obj, writeObjectArgList ) ; writeObjectState.exitWriteObject(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 // XXX I18N, Logging needed. throw new Error("invokeObjectWriter internal error",e); } catch (IllegalAccessException e) { // cannot happen } } 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: // XXX I18N, Logging needed. 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) // XXX I18N, Logging needed. throw new InvalidClassException(cl.getName(), "Nonexistent field " + fields[i].getName()); try { switch (fields[i].getTypeCode()) { case 'B': byte byteValue = fields[i].getField().getByte( o ) ; orbStream.write_octet(byteValue); break; case 'C': char charValue = fields[i].getField().getChar( o ) ; orbStream.write_wchar(charValue); break; case 'F': float floatValue = fields[i].getField().getFloat( o ) ; orbStream.write_float(floatValue); break; case 'D' : double doubleValue = fields[i].getField().getDouble( o ) ; orbStream.write_double(doubleValue); break; case 'I': int intValue = fields[i].getField().getInt( o ) ; orbStream.write_long(intValue); break; case 'J': long longValue = fields[i].getField().getLong( o ) ; orbStream.write_longlong(longValue); break; case 'S': short shortValue = fields[i].getField().getShort( o ) ; orbStream.write_short(shortValue); break; case 'Z': boolean booleanValue = fields[i].getField().getBoolean( o ) ; orbStream.write_boolean(booleanValue); break; case '[': case 'L': Object objectValue = fields[i].getField().get( o ) ; writeObjectField(fields[i], objectValue); break; default: // XXX I18N, Logging needed. throw new InvalidClassException(cl.getName()); } } catch (IllegalAccessException exc) { throw wrapper.illegalFieldAccess( exc, fields[i].getName() ) ; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -