function writeObject($className, $objectFields, IProtocolFormatter $writer)
 {
     unset($objectFields["_orbclassname"]);
     /*V3ReferenceCache*/
     $cache = $writer->GetReferenceCache();
     /*String*/
     $traitsClassId = $className;
     if ($traitsClassId == null) {
         $str = "";
         $keys = array_keys($objectFields);
         $fieldCount = count($objectFields);
         for ($i = 0; $i < $fieldCount; $i++) {
             $str .= $keys[$i] . "-";
         }
         $traitsClassId = $str;
     }
     if ($cache->HasTraits($traitsClassId)) {
         /*MemoryStream*/
         $stream = "";
         /*int*/
         $traitId = $cache->GetTraitsId($traitsClassId);
         $writer->directWriteBytes(Datatypes::OBJECT_DATATYPE_V3);
         $writer->directWriteVarInt(0x1 | $traitId << 2);
     } else {
         $writer->beginWriteNamedObject($className, count($objectFields));
         if ($className == null) {
             $cache->AddToTraitsCache($traitsClassId);
         }
         $keys = array_keys($objectFields);
         $fieldCount = count($objectFields);
         for ($i = 0; $i < $fieldCount; $i++) {
             $fieldName = $keys[$i];
             $writer->writeFieldName($fieldName);
         }
     }
     $keys = array_keys($objectFields);
     $fieldsCount = count($objectFields);
     for ($i = 0; $i < $fieldsCount; $i++) {
         $fieldName = $keys[$i];
         $writer->beginWriteFieldValue();
         try {
             MessageWriter::writeObject($objectFields[$fieldName], $writer);
         } catch (Exception $exception) {
             if (LOGGING) {
                 Log::log(LoggingConstants::ERROR, "unable to serialize object's field " . $fieldName, $exception);
             }
         }
         $writer->endWriteFieldValue();
     }
     $writer->endWriteNamedObject();
 }