Index: wp-includes/plugin.php
===================================================================
--- wp-includes/plugin.php	(revision 21458)
+++ wp-includes/plugin.php	(working copy)
@@ -724,17 +724,6 @@
 /**
  * Build Unique ID for storage and retrieval.
  *
- * The old way to serialize the callback caused issues and this function is the
- * solution. It works by checking for objects and creating an a new property in
- * the class to keep track of the object and new objects of the same class that
- * need to be added.
- *
- * It also allows for the removal of actions and filters for objects after they
- * change class properties. It is possible to include the property $wp_filter_id
- * in your class and set it to "null" or a number to bypass the workaround.
- * However this will prevent you from adding new classes and any new classes
- * will overwrite the previous hook by the same class.
- *
  * Functions and static method callbacks are just returned as strings and
  * shouldn't have any speed penalty.
  *
@@ -750,40 +739,87 @@
  * @param int|bool $priority Used in counting how many hooks were applied. If === false and $function is an object reference, we return the unique id only if it already has one, false otherwise.
  * @return string|bool Unique ID for usage as array key or false if $priority === false and $function is an object reference, and it does not already have a unique id.
  */
-function _wp_filter_build_unique_id($tag, $function, $priority) {
-	global $wp_filter;
-	static $filter_id_count = 0;
-
-	if ( is_string($function) )
+function _wp_filter_build_unique_id( $tag, $function, $priority ) {
+	if ( is_string( $function ) )
 		return $function;
 
-	if ( is_object($function) ) {
-		// Closures are currently implemented as objects
-		$function = array( $function, '' );
-	} else {
-		$function = (array) $function;
+	if ( is_object( $function ) && 'Closure' === get_class( $function ) )
+		return _wp_build_unique_closure_id( $function );
+	
+	$function = array_filter( (array) $function );
+	
+	if ( is_object( $function[0] ) ) {	
+		return spl_object_hash( $function[0] ) . '~' . get_class( $function[0] ) . '::' . $function[1];
+	} else if ( is_string( $function[0] ) ) {
+		// Static Calling
+		return join( '::', $function );
 	}
+}
 
-	if (is_object($function[0]) ) {
-		// Object Class Calling
-		if ( function_exists('spl_object_hash') ) {
-			return spl_object_hash($function[0]) . $function[1];
-		} else {
-			$obj_idx = get_class($function[0]).$function[1];
-			if ( !isset($function[0]->wp_filter_id) ) {
-				if ( false === $priority )
-					return false;
-				$obj_idx .= isset($wp_filter[$tag][$priority]) ? count((array)$wp_filter[$tag][$priority]) : $filter_id_count;
-				$function[0]->wp_filter_id = $filter_id_count;
-				++$filter_id_count;
-			} else {
-				$obj_idx .= $function[0]->wp_filter_id;
-			}
+/**
+ * Build Unique ID for Closure
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @access private
+ * @since 3.5
+ *
+ * @param callback $function Used for creating unique id
+ * @return string Unique ID for usage as array key
+ */
+function _wp_build_unique_closure_id( $function ) {
+	ob_start();
+	echo new ReflectionFunction( $function );
+	$source = ob_get_clean();
+	return md5( $source );
+}
 
-			return $obj_idx;
-		}
-	} else if ( is_string($function[0]) ) {
-		// Static Calling
-		return $function[0].$function[1];
+/**
+ * Build Unique ID for list of callbacks
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @access private
+ * @since 3.5
+ *
+ * @param string $tag Name of filter
+ * @return string Unique ID representing hash of filter callback array keys (hashes)
+ */
+function wp_filter_callbacks_hash( $tag ) {
+	global $wp_filter;
+		
+	if ( ! has_filter( $tag ) )
+		return '';
+	
+	$hashes = array();
+	
+	foreach ( $wp_filter[$tag] as $priority )
+		$hashes = array_merge( $hashes, array_keys( $priority ) );
+	
+	$hashes = array_map( '_dehash_filter_callback_object', $hashes );
+	
+	return md5( join( '', $hashes ) );
+}
+
+/**
+ * Remove the spl_object_hash portion of the filter callback key
+ * This will allow persistence between requests 
+ * 
+ * @package WordPress
+ * @subpackage Plugin
+ * @access private
+ * @since 3.5
+ * 
+ * @param string $hash
+ * @return string
+ * 
+ */
+function _dehash_filter_callback_object( $hash ) {
+	if ( strstr( $hash, '~' ) ) {
+		$bits = explode( '~', $hash );
+		array_shift( $bits );
+		return join( '', $bits );
 	}
-}
+			
+	return $hash;
+}
\ No newline at end of file
Index: wp-includes/taxonomy.php
===================================================================
--- wp-includes/taxonomy.php	(revision 21458)
+++ wp-includes/taxonomy.php	(working copy)
@@ -1218,8 +1218,8 @@
 	}
 
 	// $args can be whatever, only use the args defined in defaults to compute the key
-	$filter_key = ( has_filter('list_terms_exclusions') ) ? serialize($GLOBALS['wp_filter']['list_terms_exclusions']) : '';
-	$key = md5( serialize( compact(array_keys($defaults)) ) . serialize( $taxonomies ) . $filter_key );
+	$filter_key = wp_filter_callbacks_hash( 'list_terms_exclusions' );
+	$key = md5( serialize( compact( array_keys( $defaults ) ) ) . serialize( $taxonomies ) . $filter_key );
 	$last_changed = wp_cache_get('last_changed', 'terms');
 	if ( !$last_changed ) {
 		$last_changed = time();
