anchor.diff:      return node;
     }
   
  -  List<AssetId> _deserializeAssetIds(List<int> serializedIds) =>
  -      serializedIds.map((id) => _idToAssetId[id]).toList();
  +  Iterable<AssetId> _deserializeAssetIds(List<int> serializedIds) =>
  +      serializedIds.map((id) => _idToAssetId[id]);
   
     bool _deserializeBool(int value) => value == 0 ? false : true;
   }
   
   /// Serializes an [AssetGraph] into a [Map].
   class _AssetGraphSerializer {
  -  final _assetIdToId = <AssetId, int>{};
  +  // Iteration order does not matter
  +  final _assetIdToId = new HashMap<AssetId, int>();
   
     final AssetGraph _graph;
   
  
positive.code:       case _Field.PhaseNumber:
          return generatedNode.phaseNumber;
        case _Field.Globs:
          return generatedNode.globs.map((glob) => glob.pattern).toList();
        case _Field.NeedsUpdate:
          return _serializeBool(generatedNode.needsUpdate);
        case _Field.PreviousInputsDigest:
  
negative.code:       case _Field.Id:
          return serializer._assetIdToId[node.id];
        case _Field.Outputs:
          return node.outputs
              .map((id) => serializer._assetIdToId[id])
              .toList(growable: false);
        case _Field.PrimaryOutputs:
          return node.primaryOutputs
              .map((id) => serializer._assetIdToId[id])
              .toList(growable: false);
        case _Field.Digest:
          return _serializeDigest(node.lastKnownDigest);
        default:
  