Mark root causes as transient. Serializing nested sets is annoying, and since ErrorInfo doesn't override equality, there's no issue with preserving equality for now.

--
MOS_MIGRATED_REVID=103414237
diff --git a/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java b/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java
index 09925a3..205afea 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.skyframe.SkyFunctionException.ReifiedSkyFunctionException;
 
+import java.io.IOException;
 import java.io.Serializable;
 import java.util.Collection;
 
@@ -31,10 +32,9 @@
  * <p>This is intended only for use in alternative {@code MemoizingEvaluator} implementations.
  */
 public class ErrorInfo implements Serializable {
-  /**
-   * The set of descendants of this value that failed to build
-   */
-  private final NestedSet<SkyKey> rootCauses;
+  /** The set of descendants of this value that failed to build. */
+  // Non-final only to allow for serialization.
+  private transient NestedSet<SkyKey> rootCauses;
 
   /**
    * An exception thrown upon a value's failure to build. The exception is used for reporting, and
@@ -154,4 +154,9 @@
   public boolean isCatastrophic() {
     return isCatastrophic;
   }
+
+  private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
+    in.defaultReadObject();
+    rootCauses = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
index 352bbb1..ffb5bf8 100644
--- a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
@@ -130,6 +130,10 @@
     return true;
   }
 
+  protected boolean rootCausesStored() {
+    return true;
+  }
+
   @Before
   public void initializeReporter() {
     eventCollector = new EventCollector(EventKind.ALL_EVENTS);
@@ -369,7 +373,9 @@
       initializeReporter();
       EvaluationResult<StringValue> result = tester.eval(i == 0, "top");
       assertTrue(result.hasError());
-      assertThat(result.getError(topKey).getRootCauses()).containsExactly(topKey);
+      if (i == 0 || rootCausesStored()) {
+        assertThat(result.getError(topKey).getRootCauses()).containsExactly(topKey);
+      }
       assertEquals(topKey.toString(), result.getError(topKey).getException().getMessage());
       assertTrue(result.getError(topKey).getException() instanceof SomeErrorException);
       if (i == 0 || eventsStored()) {