private void writeOrdinaryObject(Object obj, ObjectStreamClass desc) throws IOException {
   desc.checkSerialize();
   writeObject(desc);
   if (desc.isExternalizable() && !desc.isProxy()) {
     writeExternalData((Externalizable) obj);
   } else {
     writeSerialData(obj, desc);
   }
 }
 private InteropObjectOutputStream(
     SerializationInfo info, Object obj, Class cl, ObjectStreamClass desc) throws IOException {
   dos = new ObjectDataOutputStream(info);
   if (obj instanceof ObjectStreamClass) {
     ObjectStreamClass osc = (ObjectStreamClass) obj;
     if (osc.isProxy()) {
       writeProxyDesc(osc);
     } else {
       writeNonProxyDesc(osc);
     }
   } else if (obj instanceof Serializable) {
     if (desc.isDynamicClass()) {
       info.SetType(ikvm.runtime.Util.getInstanceTypeFromClass(DynamicProxy.class));
     }
     writeOrdinaryObject(obj, desc);
   } else {
     throw new NotSerializableException(cl.getName());
   }
   dos.close();
 }