private static function generateSerializationSignature(Clazz $instanceType, CRC32 $crc, SerializationPolicy $policy)
 {
     $crc->update(self::getSerializedTypeName($instanceType));
     if (self::excludeImplementationFromSerializationSignature($instanceType)) {
         return;
     }
     $customSerializer = self::hasCustomFieldSerializer($instanceType);
     if (!is_null($customSerializer)) {
         self::generateSerializationSignature($customSerializer, $crc, $policy);
     } else {
         if ($instanceType->isArray()) {
             self::generateSerializationSignature($instanceType->getComponentType(), $crc, $policy);
         } else {
             if (!$instanceType->isPrimitive()) {
                 $fields = self::applyFieldSerializationPolicy($instanceType);
                 $clientFieldNames = $policy->getClientFieldNamesForEnhancedClass($instanceType);
                 foreach ($fields as $field) {
                     assert(!is_null($field));
                     /**
                      * If clientFieldNames is non-null, use only the fields listed there
                      * to generate the signature.  Otherwise, use all known fields.
                      */
                     if (is_null($clientFieldNames) || $clientFieldNames->contains($field->getName())) {
                         $crc->update($field->getName());
                         $crc->update(self::getSerializedTypeName($field->getType()));
                     }
                 }
                 $superClass = $instanceType->getSuperClass();
                 if (!is_null($superClass)) {
                     self::generateSerializationSignature($superClass, $crc, $policy);
                 }
             }
         }
     }
 }